如何将一个苹果代表添加到水果代表列表中?

我有一个基础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) { }
}

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

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

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

FruitDelegate <Fruit>是一个接受任何水果的代表。 例如,以下内容有效:

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

您可以使FruitDelegate <T>的类型参数T逆变:

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

它允许你将一个FruitDelegate <Fruit>实例分配给一个FruitDelegate <Apple>变量:

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

这是有效的,因为代表指的是一种方法(其他水果)接受苹果。

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

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

这是无效的,因为代表应该接受任何水果,但是会提到除苹果之外不接受任何水果的方法。

结论:由于FruitDelegate <Apple>不是FruitDelegate <Fruit>,因此无法将FruitDelegate <Apple>实例添加到List <FruitDelegate <Fruit >>。

链接地址: http://www.djcxy.com/p/55767.html

上一篇: How to add an apple delegate to a list of fruit delegates?

下一篇: Implementing ExpandoObject in Scala