在 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 { }
}