一方面我有以下的委托:代表“错误的返回类型为”
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 是 IBar,为什么它不起作用?
因此,两个问题之一: - 为什么编译器拒绝考虑方法签名匹配? - 更重要的是,我该如何做这项工作?我宁愿使用代理友好的解决方案,而不是出于约定的原因使用Func。
注意:我试过四处寻找答案,但我可能对这个问题有错误的措辞,所以随时给我一巴掌如果之前已经回答过。
编辑:正如@Jonathon Chase指出的,我的示例代码并没有完全包装这个问题。一个不起作用的例子可以发现here。编辑上面的代码以反映问题。
编辑2:所有的答案对我来说非常有用,非常感谢你的时间。如果可以的话,我会检查所有三个!
愚蠢的我认为使用接口作为通用约束也隐含地意味着'类' - 我不知道你可以使用接口价值类型首先解决的问题是增加类是要走的路。 – Nebu