逆变代表值类型

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)

jpb*_*chi 5

问题是int不是一个对象.

可以将int 装箱到对象.结果对象(也称为boxed int)当然是一个对象,但它不再是一个int.

请注意," "我在上面使用是不一样的C#操作.我的" "意味着"可通过隐式引用转换转换为 ".当我们谈论协方差和逆变时,这就是" " 的含义.

int可以隐式转换为对象,但这不是引用转换.它必须装箱.

一个House隐式可转换为Asset通过引用转换.无需创建或修改任何对象.

考虑下面的例子.这两个变量houseasset被引用相同的对象.变量integerboxedInt,在另一方面,持有相同的价值,但它们引用不同的东西.

House house = new House();
Asset asset = house;

int integer = 42;
object boxedInt = integer;
Run Code Online (Sandbox Code Playgroud)

拳击和拆箱并不像看起来那么简单.它有许多细微之处,可能会以意想不到的方式影响您的代码.混合拳击与协方差和逆变是一个让任何人炫目的简单方法.