首页 新闻 会员 周边

C# Func<People,int> 无法转换为 Func<People,object>?

0
悬赏园豆: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; }
        }
C#
GYY_顽石的主页 GYY_顽石 | 初学一级 | 园豆:143
提问于:2024-03-01 20:53
< >
分享
最佳答案
1

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#的协变和逆变

协变和逆变的类型必须是引用类型,因为值类型不具备继承性,因此类型转换存在不兼容性

收获园豆:20
dudu | 高人七级 |园豆:30948 | 2024-03-01 21:44

先给大佬一个怒赞👍👍👍👍👍!

GYY_顽石 | 园豆:143 (初学一级) | 2024-03-01 21:47

感觉有点小问题呀,int 不是继承自 System.ValueType,而 System.ValueType 也继承自 System.Object 呀,这样int不也是继承自 Object么?

GYY_顽石 | 园豆:143 (初学一级) | 2024-03-01 22:21

@GYY_顽石: int 转换为 object 需要进行装箱操作

dudu | 园豆:30948 (高人七级) | 2024-03-01 22:38

@GYY_顽石: 协变和逆变不支持值类型,详见 Why covariance and contravariance do not support value type

dudu | 园豆:30948 (高人七级) | 2024-03-01 22:38

@dudu: 非常感谢大佬,做的东西有点混乱,刚刚同时又出现了协变,哎。看看能不能绕过去

GYY_顽石 | 园豆:143 (初学一级) | 2024-03-01 22:41

@dudu: 之前的回答的确有问题,其实就是协变和逆变不支持值类型

dudu | 园豆:30948 (高人七级) | 2024-03-01 22:45

@dudu: OK,应该是这个原因。

GYY_顽石 | 园豆:143 (初学一级) | 2024-03-01 22:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册