有没有人能解释为什么C#值类型不能使用逆变?
下面的代码不起作用
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;
}发布于 2010-06-11 11:26:24
问题是int不是对象。
一个整数可以被装箱到一个对象的中。当然,结果对象(也就是装箱的int)是一个对象,但它不再是一个确切的int。
请注意,我在上面使用的" is “与C#操作符不同。我的"is“意思是”可以通过隐式引用转换转换成“。当我们谈论协方差和逆方差时,这就是" is “的意思。
int是隐式可转换为对象的,但这不是引用转换。它必须装在盒子里。
通过引用转换,House可以隐式转换为Asset。不需要创建或修改任何对象。
考虑下面的例子。变量house和asset引用的是同一个对象。另一方面,变量integer和boxedInt具有相同的值,但它们引用不同的内容。
House house = new House();
Asset asset = house;
int integer = 42;
object boxedInt = integer;Boxing and Unboxing并不像看起来那么简单。它有许多微妙之处,可能会以意想不到的方式影响您的代码。将拳击与协方差和逆方差混合在一起是一种让任何人眼花缭乱的简单方法。
发布于 2010-06-10 06:14:08
我同意Anthony Pegram的评论-它基于的引用类型具有不同于值类型的内存占用: CLR可以隐式地使用一种类型的类作为其超级类型的类,但当您开始使用值类型时,CLR将需要对整数进行装箱,以便它可以在对象的位置工作。
如果你想让它正常工作,我倾向于将声明包装在一个表达式中:
AssetDelegate aw = new AssetDelegate((m) => DelegateMethod(m));就语法而言,我不知道这是不是很好的做法,但请记住,装箱和拆箱是很昂贵的。
https://stackoverflow.com/questions/3004260
复制相似问题