加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 结合代表和逆转

发布时间:2020-12-15 04:22:34 所属栏目:百科 来源:网络整理
导读:文章陈述如下: http://msdn.microsoft.com/en-us/library/dd799517.aspx 差异不适用于代表组合.也就是说,给定两个类型的代表Action Derived和行动基础 (Action(Of Derived)和Action(Of Base)在Visual Basic中),您不能将第二个委托与第一个委托合并,尽管结果
文章陈述如下: http://msdn.microsoft.com/en-us/library/dd799517.aspx

差异不适用于代表组合.也就是说,给定两个类型的代表Action< Derived>和行动<基础> (Action(Of Derived)和Action(Of Base)在Visual Basic中),您不能将第二个委托与第一个委托合并,尽管结果是类型安全的. Variance允许将第二个委托分配给Action< Derived>类型的变量,但委托只有在其类型完全匹配时才能组合.

Action<B> baction = (taret) => { Console.WriteLine(taret.GetType().Name); };
Action<D> daction = baction;
Action<D> caction = baction + daction;

在上面的代码中,baction和daction采用不同的参数.但我仍然可以将它们结合起来.
我错过了什么?

TIA.

解决方法

我同意,文件不清楚.

问题是两个组合委托的运行时类型必须匹配.这意味着存在编译时类型匹配的情况,但运行时类型不匹配.

考虑例如:

Func<string> f1 = ()=>"";
Func<object> f2 = ()=>null;
Func<object> f3 = f1; // legal in C# 4 because of covariance
Func<object> f4 = f2 + f3;

这在编译时是合法的;您正在添加两个具有相同编译时类型的委托.但在运行时它会失败,因为运行时要求运行时类型完全匹配.

这是CLR类型系统中的一个不幸的漏洞.我希望有一天我们可以修好它,但没有承诺.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读