首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合委托和逆变

组合委托和逆变
EN

Stack Overflow用户
提问于 2011-05-20 07:19:09
回答 1查看 571关注 0票数 6

本文陈述了以下内容:http://msdn.microsoft.com/en-us/library/dd799517.aspx

方差不适用于委托组合。也就是说,如果给定两个类型为Action<Derived>Action<Base> (在Visual Basic中为Action(Of Derived)Action(Of Base) )的委托,则不能将第二个委托与第一个委托组合在一起,尽管结果将是类型安全的。Variance允许将第二个委托赋值给Action<Derived>类型的变量,但只有当它们的类型完全匹配时,才能组合委托。

代码语言:javascript
复制
Action<B> baction = (taret) => { Console.WriteLine(taret.GetType().Name); };
Action<D> daction = baction;
Action<D> caction = baction + daction;

在上面的代码中,bactiondaction采用不同的参数。但我仍然能够将它们结合起来。我遗漏了什么?

蒂娅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-20 08:03:33

文档不清楚,我同意。

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

请考虑以下示例:

代码语言:javascript
复制
Func<string> f1 = ()=>"";
Func<object> f2 = ()=>null;
Func<object> f3 = f1; // legal in C# 4 because of covariance
Func<object> f4 = f2 + f3;

这在编译时是合法的;您添加的是同一编译时类型的两个委托。但在运行时,它将失败,因为运行时要求运行时类型完全匹配。

这是CLR类型系统中的一个不幸的漏洞。我希望有一天我们能把它修好,但不能保证。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6065898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档