结合代表和逆转

时间:2011-05-19 23:19:09

标签: c#

文章陈述如下:http://msdn.microsoft.com/en-us/library/dd799517.aspx

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

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

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

TIA。

1 个答案:

答案 0 :(得分:10)

文件不清楚,我同意。

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

考虑例如:

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

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

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