【发布时间】:2015-08-10 15:58:59
【问题描述】:
我将我的类层次结构定义为 Object->Fruit->Apple
class Fruit : object{}
class Apple : Fruit{}
并创建了两个静态方法来处理这些类
static Fruit FruitProcessor(string fruit)
{
return new Fruit();
}
static Apple ApplesProcessor(string apple)
{
return new Apple();
}
现在我声明一个委托没有任何 in, out关键字
public delegate TResult Funk<T, TResult>(T arg);
在我的代码中,我执行以下任务:
Funk<string, Fruit> myFunc;
myFunc = FruitProcessor; // ok, we match signature exactly
myFunc = ApplesProcessor;// this should not work, but works
由于我没有将 TResult 声明为协变 out 参数,因此不能将 ApplesProcessor 分配给 myFunc 委托。但有可能,程序编译和执行没有任何错误。
如果我更改 Funk 签名以添加 out TResult
public delegate TResult Funk<T, out TResult>(T arg);
一切都和以前一样。
这怎么可能?
【问题讨论】:
-
这不是what you asked earlier,而是使用方法而不是lambdas?我认为这两个都包含在作为重复链接的问题中......? IE 如果您使用的是 lambda,您 可以 使签名匹配,所以您 必须 使其匹配?但是对于方法,这不是强制的吗?
-
这是一个稍微不同的问题。上一篇是关于反义函数的特殊解释。这似乎是由 .NET 3.5 更改引起的。
标签: c# delegates covariance