向我解释为什么我在情况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.ValueType
或System.Enum
)实现的接口,但这些只适用于盒装值
因此,不可能对值类型使用继承或方差,因为您不能将它们声明为盒装的,只能声明为未盒装的。