一方面,我有以下代表:
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:所有的答案对我都很有益,非常感谢您的宝贵时间。如果可以的话,我将检查所有三个!
最佳答案
“错误的返回类型”错误是因为variance不support value types。因此,可以转换实现class
的IBar
,而实现struct
的不是:
class RefTypeBar : IBar {}
struct ValueTypeBar : IBar {}
FooDelegate f1 = new MyClass<RefTypeBar>().Foo; // This works
FooDelegate f2 = new MyClass<ValueTypeBar().Foo; // Fails - wrong return type
该错误是在
MyClass<T>
内部生成的,因为T
可能是struct
,因此编译器无法保证可以为Foo
分配FooDelegate
。如果将class
约束添加到MyClass<T>
,则代码将编译。public class MyClass<T> : MyBaseClass where T : class, IBar, new()
关于c# - 代表“错误的返回类型”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34970523/