.Net 【提高】 协变和逆变

协变 逆变

主要用于泛型接口和委托中
协变就是支持泛型子类自动转泛型父类
逆变就是支持泛型父类自动转泛型子类

协变IEnumerable out

namespace System.Collections.Generic
{
    //
    // 摘要:
    //     Exposes the enumerator, which supports a simple iteration over a collection of
    //     a specified type.
    //
    // 类型参数:
    //   T:
    //     The type of objects to enumerate.
    public interface IEnumerable<out T> : IEnumerable
    {
        //
        // 摘要:
        //     Returns an enumerator that iterates through the collection.
        //
        // 返回结果:
        //     An enumerator that can be used to iterate through the collection.
        IEnumerator<T> GetEnumerator();
    }
}

逆变IComparable in

namespace System
{
    //
    // 摘要:
    //     Defines a generalized comparison method that a value type or class implements
    //     to create a type-specific comparison method for ordering or sorting its instances.
    //
    // 类型参数:
    //   T:
    //     The type of object to compare.
    public interface IComparable<in T>
    {
        //
        // 摘要:
        //     Compares the current instance with another object of the same type and returns
        //     an integer that indicates whether the current instance precedes, follows, or
        //     occurs in the same position in the sort order as the other object.
        //
        // 参数:
        //   other:
        //     An object to compare with this instance.
        //
        // 返回结果:
        //     A value that indicates the relative order of the objects being compared. The
        //     return value has these meanings: Value Meaning Less than zero This instance precedes
        //     other in the sort order. Zero This instance occurs in the same position in the
        //     sort order as other. Greater than zero This instance follows other in the sort
        //     order.
        int CompareTo(T other);
    }
}

逆变Action in

namespace System
{
    //
    // 摘要:
    //     Encapsulates a method that has a single parameter and does not return a value.
    //
    // 参数:
    //   obj:
    //     The parameter of the method that this delegate encapsulates.
    //
    // 类型参数:
    //   T:
    //     The type of the parameter of the method that this delegate encapsulates.
    public delegate void Action<in T>(T obj);
}

.NET 中自带的斜变逆变泛型

IEnumerable<out T> //接口
Action<in T> //委托
Func<out TResult> //委托
IReadonlyList<out T>//接口
IReadonlycollection<out T>//接口
原文地址:https://www.cnblogs.com/thomerson/p/15073209.html