Loading

c# in out 之协变和逆变

在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。 协变保留分配兼容性,逆变则与之相反。

using System;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {

            // 泛型接口 逆变

            IMyInCs<Cs> cs = new MyCs<Cs>();

            IMyInCs<CsSon> cs1 = cs;
            //IMyInCs<CsBase> cs2 = cs; error

            // 泛型接口 协变
            IMyOutCs<Cs> cs3 = new MyCs<Cs>();

            IMyOutCs<CsBase> cs4 = cs3;
            //IMyOutCs<CsSon> cs5 = cs3; error

            // 委托逆变Action<in arg1>
            Action<Cs> action1 = Ac1;
            //Action<Cs> action2 = Ac2; error
            Action<Cs> action3 = (cs) => { };
            //Action<Cs> action4 = (CsBase cs) => { }; 不知道错在哪里

            // 委托协变 Func<out result>
            Func<Cs> func1 = () => new CsSon();
            //Func<Cs> func2 = () => new CsBase(); error

            Console.WriteLine($"Hello World!");

        }

        public static void Ac1(CsBase cs) { }

        public static void Ac2(CsSon cs) { }
    }

    public interface IMyInCs<in T>
    {
        void Run() { }
    }

    public interface IMyOutCs<out T>
    {
        void Run() { }
    }

    public class MyCs<T> : IMyInCs<T>, IMyOutCs<T>
    {
        public void Run() { }
    }

    public class CsBase { }
    public class Cs : CsBase { }
    public class CsSon : Cs { }

}

 

posted @ 2020-05-10 22:44  microestc  阅读(236)  评论(0)    收藏  举报