一方面我有以下的委託:代表「錯誤的返回類型爲」
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