【发布时间】:2021-12-24 01:16:00
【问题描述】:
我有类 B 和 C 继承自 A。
public class A { }
public class B : A { }
public class C : A { }
我有一些函数将对象 B 和 C 作为参数:
public void FunB(B obj) { }
public void FunC(C obj) { }
我想创建一个接受任何这些函数作为参数的函数。我尝试使用代表,但我没有找到解决方案。我试过这个,但我得到以下错误:
public class Test
{
public void FunB(B obj) { }
public void FunC(C obj) { }
public delegate void Delegate(A obj);
public static void Method(Delegate fun) { }
public void Pain()
{
Delegate funB = FunB; // No overload for FunB matches the delegate Test.Delegate
Delegate fun2 = (A obj) => { };
fun2 += FunB; // No overload for FunB matches the delegate Test.Delegate
Method(FunB); // Argument 1: cannot convert from 'method group' to 'Test.Delegate'
}
}
我阅读了the documentation(这就是我尝试使用fun2 += FunB 的原因),但很明显有些东西我不明白。知道如何解决吗?
【问题讨论】:
-
FunB的编写期望它传递的内容是至少B或派生自它的东西。如果您可以转换为您的委托,您就可以通过C调用它。类型系统可以帮助您避免这个错误。 -
差异在另一个方向起作用。如果您有
FunA(A obj),您应该能够将其分配给Delegate(C obj),因为 该函数可以安全地处理任何A,包括显然它必须是C。 -
好的,现在我明白了,谢谢。我读错了方向的逆变。那么,有没有什么方法可以创建一个方法来接受带有来自父类的参数的函数呢?
-
我相应地更改了问题的标题。我考虑过使用泛型,但它不能是any泛型,它应该是具有基类
A...的对象 -
好的,我认为像
public static void Method<T>(Foo<T> fun) where T: A { }这样的事情会奏效...
标签: c# delegates contravariance