一方面,我有以下代表:

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:所有的答案对我都很有益,非常感谢您的宝贵时间。如果可以的话,我将检查所有三个!

最佳答案

“错误的返回类型”错误是因为variancesupport value types。因此,可以转换实现classIBar,而实现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/

10-12 00:29
查看更多