什么是<in t =“”>和<out t =“”>在泛型</out> </in>中

时间:2013-02-21 14:34:28

标签: c# generics

我明白什么是&#34; T&#34;在泛型中,就像在这个例子中一样:

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

但是不要理解&#34;在T&#34;就像在这个例子中一样:

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

和&#34; out T&#34;就像在这个例子中一样:

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

有人可以帮我理解这个吗?

2 个答案:

答案 0 :(得分:9)

<out T>表示T 协变

似乎有理由认为一系列长颈鹿可以被视为一系列动物。接口的“协方差”意味着“如果存在从GiraffeAnimal的隐式引用转换,则还存在从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 逆变

似乎可以比较两只动物的代码可以比较两只长颈鹿。界面的“逆变量”与反转方向的协方差相同。这意味着“如果存在从GiraffeAnimal的隐式引用转换,那么还存在从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);

参见:

答案 1 :(得分:3)

您可以阅读.NET 4.0中引入的generic covariance and contravariance。 Eric Lippert在此主题上也有series of blog posts