具体问题如下代码:
static void Main(string[] args)
{
People p = new People { Name = "Wayne",Age=2 };
Func<People,object> a = t=>p.Name;
Func<People, int> b = t => p.Age;
Func<People,string> d = t => p.Name;
a = d;
a = b;// 此处编译都不通过?为什么
Console.ReadKey();
}
public class People
{
public string Name { get; set; }
public int Age { get; set; }
}
func
用到了 C# 的协变(Covariance)与逆变(Contravariance),in
是逆变,out
是协变
public delegate TResult Func<in T, out TResult>(T arg);
上面代码的编译错误是:
Cannot implicitly convert type 'System.Func<People, int>' to 'System.Func<People, object>'
这是一个协变问题,int
没有继承自 object
,无法协变,所以 a = b;
编译报错。
string
继承自 object
,可以协变,所以 a = d;
编译通过。
详见园子里的博文:了解C#的协变和逆变
协变和逆变的类型必须是引用类型,因为值类型不具备继承性,因此类型转换存在不兼容性
先给大佬一个怒赞👍👍👍👍👍!
感觉有点小问题呀,int 不是继承自 System.ValueType,而 System.ValueType 也继承自 System.Object 呀,这样int不也是继承自 Object么?
@GYY_顽石: int 转换为 object 需要进行装箱操作
@GYY_顽石: 协变和逆变不支持值类型,详见 Why covariance and contravariance do not support value type
@dudu: 非常感谢大佬,做的东西有点混乱,刚刚同时又出现了协变,哎。看看能不能绕过去
@dudu: 之前的回答的确有问题,其实就是协变和逆变不支持值类型
@dudu: OK,应该是这个原因。