gpt4 book ai didi

c# - 委托(delegate)不接受子类?

转载 作者:太空狗 更新时间:2023-10-29 22:20:44 24 4
gpt4 key购买 nike

我的委托(delegate)似乎不接受子类,我认为一个例子是最简单的。

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

编译器错误:

No overload for Test matches Callback

有没有办法让我的委托(delegate)接受扩展 A 的类?

最佳答案

Isn't this odd because B extends A?

你的想法是对的,但是方向错了。让我们考虑一个更容易推理的例子:

class Animal {}
class Reptile : Animal {}
class Snake : Reptile {}
class Mammal : Animal {}
class Tiger : Mammal {}
class Giraffe : Mammal {}
delegate void D(Mammal m);
static void DoAnimal(Animal a) {}
static void DoMammal(Mammal m) {}
static void DoTiger(Tiger t) {}

D dm = DoMammal;
dm(new Tiger());

这显然是合法的。 dm 需要是一种接受哺乳动物的方法,它确实是。

D dt = DoTiger;
dt(new Giraffe());

这显然是非法的。您不能将采用老虎的方法分配给采用哺乳动物的委托(delegate),因为采用哺乳动物的委托(delegate)可以采用任何哺乳动物,而不仅仅是老虎。如果这是合法的,那么就有可能将长颈鹿传递给一种捕获老虎的方法。

这个呢?

D da = DoAnimal;
da(new Giraffe());

没关系。 da 是接受任何哺乳动物的方法的委托(delegate)。一种适用于任何动物的方法显然也适用于任何哺乳动物。您可以将 DoAnimal(Animal) 分配给委托(delegate) D(Mammal),因为 Mammal 扩展了 Animal。你现在知道你是如何向后延伸的方向了吗?

返回类型另一方面以您认为的方式工作:

delegate Mammal F();
static Animal GetAnimal() {...}
static Mammal GetMammal() {...}
static Tiger GetTiger() {...}

F fm = GetMammal;
Mammal m = fm();

没问题。

F ft = GetTiger;
Mammal t = ft();

没问题; GetTiger 返回一只老虎,因此您可以将其分配给要求其目标返回哺乳动物的委托(delegate)。

F fa = GetAnimal;
Mammal a = fa();

这样不好。 GetAnimal 可能会返回一条 Snake,现在您有一个类型为 Mammal 的变量,其中包含一条 Snake。这一定是非法的。

此功能称为“成员组转换的协变和逆变”,它是在 C# 2.0 中引入的。有关此主题的更多信息,请参阅我的文章:

https://ericlippert.com/2007/10/19/covariance-and-contravariance-in-c-part-3-method-group-conversion-variance/

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com