С# delegate方差不能用于int



向我解释为什么我在情况3中得到编译错误的逻辑?

所有这些类型都派生自Object。那么问题是什么呢?

public delegate object DelegateType();
public static void Main()
{
DelegateType case1 = Test;
DelegateType case2 = Test2;
DelegateType case3 = Test3;
}
public static string Test()
{
return 1.ToString();
}
public static ValueType Test2()
{
return 1;
}
public static int Test3()
{
return 1;
}

方差曾经适用于引用类型,即类型之间存在保值(没有任何操作)转换的地方。装箱/拆箱:不被视为保值,因此:值类型和对象之间,或者值类型和这些值类型实现的接口之间没有差异。

这是基于一个误解。

未装箱的值类型不继承任何东西,甚至不继承System.ValueType

.NET规范详细说明了这一点,ECMA-335 Section 8.2.4:

接口和继承仅在引用类型上定义。因此,虽然值类型定义(§8.9.7)可以指定由值类型和它继承的类(System.ValueTypeSystem.Enum)实现的接口,但这些只适用于盒装值

因此,不可能对值类型使用继承或方差,因为您不能将它们声明为盒装的,只能声明为未盒装的。

最新更新