2

この例のように、ジェネリックの「T」が何であるかを理解しています:

public interface IEquatable<T>
{            
    bool Equals(T other);
}

ただし、次の例のように「in T」を理解しないでください。

public interface IComparer<in T>
{            
    int Compare(T x, T y);
}

この場合のように、「out T」:

public interface IEnumerable<out T> : IEnumerable
{            
    IEnumerator<T> GetEnumerator();
}

誰かがこれを理解するのを手伝ってもらえますか??

4

2 に答える 2

9

<out T>T共変であることを示します。

一連のキリンを一連の動物として扱うことができるのはもっともらしいようです。インターフェイスの「共分散」とは、「からへの暗黙の参照変換がある場合、からGiraffeへの暗黙の参照変換Animalもあることを意味I<Giraffe>しますI<Animal>。構築された型の兌換性は、型引数の兌換性と「同じ方向に変化します」。

例:

// Valid!                                // Invalid!
// Every giraffe is an animal            // Not every animal is a giraffe
IEnumerable<Giraffe> giraffes = ...;     IEnumerable<Animal> animals = ...;
IEnumerable<Animal> animals = giraffe;   IEnumerable<Giraffe> giraffes = animals;
Animal animal = animals.First();         Giraffe giraffe = giraffes.First();

<in T>T反変であることを示します。

2匹の動物を比較できるコードが2匹のキリンも比較できることはもっともらしいようです。インターフェースの「反変性」は、方向を逆にした共分散と同じです。これは、「からへの暗黙の参照変換がある場合、からGiraffeへの暗黙の参照変換Animalもあることを意味I<Animal>I<Giraffe>ます。構築された型の兌換性は、型引数の兌換性とは「反対方向に変化します」。

例:

// Valid!                                // Invalid!
// Animal comparer can compare           // Giraffe comparer cannot compare
// giraffes                              // arbitrary animals
IComparer<Animal> animalC = ...;         IComparer<Giraffe> giraffeC = ...;
IComparer<Giraffe> giraffeC = animalC;   IComparer<Animal> animalC = giraffeC;
int result = giraffeC.Compare(x, y);     int result = animalC.Compare(x, y);

見る:

于 2013-02-21T14:36:40.003 に答える
3

generic covariance and contravariance.NET4.0で導入されたものについて読むことができます。EricLippertもseries of blog postsこのトピックについて説明しています。

于 2013-02-21T14:36:14.947 に答える