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协变的。

可以将一系列长颈鹿视为一系列动物似乎是合理的。接口的“协变”意味着“如果存在从 to 的隐式引用转换,那么也存在从Giraffeto的隐式引用转换。构造类型的可转换性与类型参数的可转换性“在同一方向上变化”。AnimalI<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逆变的。

可以比较两只动物的代码也可以比较两只长颈鹿,这似乎是合理的。界面的“逆变”与方向相反的协方差相同。这意味着“如果存在从 to 的隐式引用转换,那么也存在从Giraffeto的隐式引用转换。构造类型的可转换性“以相反的方向变化”作为类型参数的可转换性。AnimalI<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.NET 4.0 中引入的内容。Eric Lippert 也有series of blog posts这个话题。

于 2013-02-21T14:36:14.947 回答