泛型中的<in T>和<out T>是什么

kas*_*hif 2 c# generics

我理解泛型中的"T"在这个例子中是什么:

public interface IEquatable<T>
{            
    bool Equals(T other);
}
Run Code Online (Sandbox Code Playgroud)

但是在这个例子中不要理解"在T中":

public interface IComparer<in T>
{            
    int Compare(T x, T y);
}
Run Code Online (Sandbox Code Playgroud)

和"out T"在这个例子中:

public interface IEnumerable<out T> : IEnumerable
{            
    IEnumerator<T> GetEnumerator();
}
Run Code Online (Sandbox Code Playgroud)

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

dtb*_*dtb 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();
Run Code Online (Sandbox Code Playgroud)

<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);
Run Code Online (Sandbox Code Playgroud)

看到: