【发布时间】:2016-01-23 23:58:23
【问题描述】:
一方面,我有以下代表:
public delegate IBar FooDelegate(string str);
public delegate IBar FooDelegateWithRef(string str, IBar someBar);
另一方面,我有一个通用类:
public class MyBaseClass
where T : IBar, new()
{
public FooDelegate myFunc;
public FooDelegateWithRef myFuncWithRef;
}
public class MyClass<T> : MyBaseClass
where T : IBar, new()
{
public MyClass()
{
myFunc = Foo; //"Wrong return type"
myFuncWithRef = FooWithRef; //"No overload...matches delegate"
}
public T Foo(string){ ... }
public T FooWithRef(string, IBar){ ... }
}
我的问题是当我执行以下操作时:
FooDelegate fooRef = MyClassInstance.Foo;
我收到“错误的返回类型”错误。我知道委托签名必须与方法签名匹配,但是由于泛型中的“where”指令实际上明确指定了 T is IBar,为什么它不起作用?
所以两个问题合二为一: - 为什么编译器拒绝认为方法签名是匹配的? - 更重要的是,我怎样才能使这项工作?出于约定的原因,我更喜欢委托友好的解决方案,而不是使用 Func。
注意:我试图四处寻找答案,但我可能对这个问题的措辞有误,所以如果之前已经回答过,请随意扇我一巴掌。
编辑:正如@Jonathon Chase 指出的那样,我的示例代码并没有完全解决问题。可以在here 找到一个无效的示例。编辑了上面的代码以反映问题。
编辑 2:所有答案对我来说都非常有用,非常感谢您抽出宝贵的时间。如果可以的话,我会检查所有三个!
【问题讨论】: