在第一个样本中,演员是刚刚在封面下完成的吗?
是的,你可以这么说!
该Combine
方法是用 .NET 1 编写的,其中不存在通用 C#。因此,正式的返回类型Combine
必须是Delegate
:
public static Delegate Combine(Delegate a, Delegate b)
{
...
}
但是该方法仍然返回一个Action
when botha
和b
are Action
。是的,a
并且b
需要具有相同的运行时类型。
请不要写成MulticastDelegate.Combine
类定义Combine
的方法。因此说,这不那么令人困惑。static
System.Delegate
Delegate.Combine
車輛改道:
当前版本的 C# 和Combine
逆变委托类型存在问题。考虑以下:
Action<string> doSomethingToString; // will be assigned below
Action<ICloneable> a = cloneable => { Console.WriteLine("I'm cloning"); cloneable.Clone(); }
Action<IConvertible> b = convertible => { Console.WriteLine("I'm converting"); convertible.ToInt32(CultureInfo.InvariantCulture); }
Action<string> aStr = a; // OK by contravariance of Action<in T>, aStr and a reference same object
Action<string> bStr = b; // OK by contravariance of Action<in T>, bStr and b reference same object
doSomethingToString = aStr + bStr; // throws exception
doSomethingToString("42"); // should first clone "42" then convert "42" to Int32
现在,假设某些未来版本的框架引入了一个通用Combine
方法:
public static TDel Combine<TDel>(TDel a, TDel b) where TDel : Delegate
{
// use typeof(TDel) to figure out type of new "sum" delegate
}
并假设 C# 已更改+
为转换为对新泛型Combine<>
方法的调用,那么逆变和委托组合将被修复!我猜他们告诉我们他们有更高的优先级,但仍然如此。