 悬赏园豆:20
                [已解决问题] 
            
                    解决于 2024-03-01 21:48
                悬赏园豆:20
                [已解决问题] 
            
                    解决于 2024-03-01 21:48 
                 
        具体问题如下代码:
   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,应该是这个原因。