其实就是和强转的意思差不多 只不过out 和 in已经提前强转了,我是这么理解的
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
#region 协变和逆变
Console.WriteLine("-----------------协变和逆变-------------------");
People people = new People();
People people1 = new Teacher();
Teacher teacher = new Teacher();
List<People> peoples = new List<People>();
IListOut<People> listOut = new ListOut<People>();
IListOut<People> listOut1 = new ListOut<Teacher>();
IListIn<Teacher> listIn = new ListIn<Teacher>();
IListIn<Teacher> listIn1 = new ListIn<People>();
IOutInList<Teacher, People> myList1 = new OutInList<Teacher, People>();
IOutInList<Teacher, People> myList2 = new OutInList<Teacher, Teacher>();
IOutInList<Teacher, People> myList3 = new OutInList<People, People>();
IOutInList<Teacher, People> myList4 = new OutInList<People,Teacher>();
#endregion
}
}
#region 协变和逆变
class People
{
public int Id { get; set; }
}
class Teacher : People
{
public string Name { get; set; }
}
interface IListOut<out T>
{
T GetT();
}
class ListOut<T> : IListOut<T>
{
public T GetT()
{
return default(T);
}
}
interface IListIn<in T>
{
void Show(T t);
}
class ListIn<T> : IListIn<T>
{
public void Show(T t)
{
}
}
public interface IOutInList<in inT, out outT>
{
void Show(inT t);
outT GetT();
outT Do(inT t);
}
public class OutInList<T1, T2> : IOutInList<T1, T2>
{
public void Show(T1 t)
{
}
public T2 GetT()
{
return default;
}
public T2 Do(T1 t)
{
return default(T2);
}
}
#endregion
}