<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);
見る: