Jac*_*ada 7 c# contravariance c#-3.0
任何人都可以阐明为什么逆变不适用于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;
}
Run Code Online (Sandbox Code Playgroud)
问题是int不是一个对象.
可以将int 装箱到对象.结果对象(也称为boxed int)当然是一个对象,但它不再是一个int.
请注意," 是 "我在上面使用是不一样的C#操作是.我的" 是 "意味着"可通过隐式引用转换转换为 ".当我们谈论协方差和逆变时,这就是" 是 " 的含义.
int可以隐式转换为对象,但这不是引用转换.它必须装箱.
一个House隐式可转换为Asset通过引用转换.无需创建或修改任何对象.
考虑下面的例子.这两个变量house和asset被引用相同的对象.变量integer和boxedInt,在另一方面,持有相同的价值,但它们引用不同的东西.
House house = new House();
Asset asset = house;
int integer = 42;
object boxedInt = integer;
Run Code Online (Sandbox Code Playgroud)
拳击和拆箱并不像看起来那么简单.它有许多细微之处,可能会以意想不到的方式影响您的代码.混合拳击与协方差和逆变是一个让任何人炫目的简单方法.