我的代表似乎不接受子类,我认为一个例子是最简单的。

public class A
{
     public A() { }
}

public class B : A
{
     public B() { }
}

public class Program
{
     private delegate void CallBack(A a);
     private static CallBack callBack = new CallBack(Test);

     public Main(string[] args)
     {
          callBack(new B());
     }

     private static void Test(A a)
     {
          Console.WriteLine("Test()");
     }

     // Compilation error occurs if Test becomes:
     private static void Test(B a)
     {
          Console.WriteLine("Test()");
     }
 }

当我将Test更改为接受B时,它将引发编译错误。这是不是很奇怪,因为B扩展了A吗?

编译器错误:



有没有一种方法可以使我的委托(delegate)接受扩展A的类?

最佳答案

这并不奇怪,因为如果您有一个扩展了CA类的对象,则仅接受Test()的对象传递给B是没有意义的。用于Callback的任何方法都必须接受任何A,而不仅仅是特定的子类。如果您希望Callback也接受B,则需要更改Test()委托(delegate)签名以接受B

class C : A {};

Callback callback = Test;

callback(new C()); //what if Test() accepted B???

关于c# - 委托(delegate)不接受子类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3733551/

10-13 03:23