gpt4 book ai didi

c# - 如何将苹果委托(delegate)添加到水果委托(delegate)列表中?

转载 作者:太空狗 更新时间:2023-10-29 20:31:40 25 4
gpt4 key购买 nike

我有一个示例程序,它有一个基 Fruit 类和一个派生的 Apple 类。

class Testy
{
public delegate void FruitDelegate<T>(T o) where T : Fruit;

private List<FruitDelegate<Fruit>> fruits = new List<FruitDelegate<Fruit>>();

public void Test()
{
FruitDelegate<Apple> f = new FruitDelegate<Apple>(EatFruit);

fruits.Add(f); // Error on this line
}

public void EatFruit(Fruit apple) { }
}

我想要一个水果委托(delegate)列表,并且能够将更多派生水果的委托(delegate)添加到列表中。我相信这与协变或逆变有关,但我似乎无法弄清楚。

错误信息是(没有命名空间):

The best overloaded method match for 'List<FruitDelegate<Fruit>>.Add(FruitDelegate<Fruit>)' has some invalid arguments`

最佳答案

FruitDelegate 是接受任何水果的委托(delegate)。例如,以下是有效的:

FruitDelegate<Fruit> f = new FruitDelegate<Fruit>(EatFruit);
f(new Apple());
f(new Banana());

您可以使FruitDelegate 的类型参数T contravariant :

public delegate void FruitDelegate<in T>(T o) where T : Fruit;

它允许您将 FruitDelegate 实例分配给 FruitDelegate 变量:

FruitDelegate<Apple> f = new FruitDelegate<Fruit>(EatFruit);
f(new Apple());

这是有效的,因为委托(delegate)引用了一个方法(在其他水果中)接受苹果。

但是,您不能将 FruitDelegate 实例分配给 FruitDelegate 变量:

FruitDelegate<Fruit> f = new FruitDelegate<Apple>(EatApple); // invalid
f(new Apple());
f(new Banana());

这是无效的,因为委托(delegate)应该接受任何水果,但会引用一个不接受除苹果以外的任何水果的方法。

结论:您不能将 FruitDelegate 实例添加到 List > ,因为 FruitDelegate 不是 FruitDelegate

关于c# - 如何将苹果委托(delegate)添加到水果委托(delegate)列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7829848/

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