【发布时间】:2011-05-19 23:19:08
【问题描述】:
文章声明如下: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;
上述代码中baction和daction采用不同的参数。但我仍然能够将它们结合起来。
我错过了什么?
TIA。
【问题讨论】:
-
在您的示例中,
baction和daction是对同一对象的引用。因此baction.GetType() == daction.GetType()当然,因为它是同一个实例。当两个委托对象不同并且具有不同的运行时类型时,就会出现问题。现在,在 .NET 4.0 之前,对于每个委托对象,运行时类型和编译时类型是一致的,因为委托是(密封类型和)不变的。但在 .NET 4.0 和 C# 4 及更高版本中,编译时Action<string>可能是运行时Action<object>、Action<ICloneable>、Action<IEnumerable<char>>等等。
标签: c#