我明白什么是" T"在泛型中,就像在这个例子中一样:
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();
}
有人可以帮我理解这个吗?
答案 0 :(得分: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
逆变。
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);
参见:
答案 1 :(得分:3)
您可以阅读.NET 4.0中引入的generic covariance and contravariance
。 Eric Lippert在此主题上也有series of blog posts
。