首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Contravariant委托值类型

Contravariant委托值类型
EN

Stack Overflow用户
提问于 2010-06-09 16:45:35
回答 2查看 219关注 0票数 7

有没有人能解释为什么C#值类型不能使用逆变?

下面的代码不起作用

代码语言:javascript
复制
private delegate Asset AssetDelegate(int m);

internal string DoMe()
{
    AssetDelegate aw = new AssetDelegate(DelegateMethod);
    aw(32);
    return "Class1";
}

private static House DelegateMethod(object m)
{
    return null;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-11 11:26:24

问题是int不是对象

一个整数可以被装箱到一个对象的中。当然,结果对象(也就是装箱的int)是一个对象,但它不再是一个确切的int。

请注意,我在上面使用的" is “与C#操作符不同。我的"is“意思是”可以通过隐式引用转换转换成“。当我们谈论协方差和逆方差时,这就是" is “的意思。

int是隐式可转换为对象的,但这不是引用转换。它必须装在盒子里。

通过引用转换,House可以隐式转换为Asset。不需要创建或修改任何对象。

考虑下面的例子。变量houseasset引用的是同一个对象。另一方面,变量integerboxedInt具有相同的值,但它们引用不同的内容。

代码语言:javascript
复制
House house = new House();
Asset asset = house;

int integer = 42;
object boxedInt = integer;

Boxing and Unboxing并不像看起来那么简单。它有许多微妙之处,可能会以意想不到的方式影响您的代码。将拳击与协方差和逆方差混合在一起是一种让任何人眼花缭乱的简单方法。

票数 5
EN

Stack Overflow用户

发布于 2010-06-10 06:14:08

我同意Anthony Pegram的评论-它基于的引用类型具有不同于值类型的内存占用: CLR可以隐式地使用一种类型的类作为其超级类型的类,但当您开始使用值类型时,CLR将需要对整数进行装箱,以便它可以在对象的位置工作。

如果你想让它正常工作,我倾向于将声明包装在一个表达式中:

代码语言:javascript
复制
AssetDelegate aw = new AssetDelegate((m) => DelegateMethod(m));

就语法而言,我不知道这是不是很好的做法,但请记住,装箱和拆箱是很昂贵的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3004260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档