2011-10-20 2 views
7

私は、ベースのFruitクラスと導出されたAppleクラスのサンプルプログラムを持っています。果物代議員のリストに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` 

答えて

4

FruitDelegate <フルーツ>は、任意の果物を受け入れるデリゲートです。

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

あなたはFruitDelegate <フルーツを割り当てることができます:

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

あなたはタイプパラメータTFruitDelegateの<T>contravariantを行うことができます。たとえば、以下は有効です>のインスタンスからフルーツディレクター<アップル>変数:デリゲートはリンゴを受け付ける(他の果物の中で)方法を指すため

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

これは、有効です。

しかし、あなたはFruitDelegate <フルーツ>変数にFruitDelegate <アップル>インスタンスを割り当てることができません。

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

これは、デリゲートはどんな果物を受け入れる必要があるため、無効であるが、これらに参照することになりリンゴ以外の果実を受け入れない方法。

結論:FruitDelegate <アップル>FruitDelegate <フルーツ>ではありませんので、あなたは、FruitDelegate <アップル一覧< FruitDelegate <フルーツ> >から>インスタンスを追加することはできません。

関連する問題