posted at 2019.12.2 13:12 by 风信子
C#显式变化使用IN和OUT关键字只适用于委托和接口,不适用于类、结构和方法。
下面是笔者制作的学习代码,特别有助于理解C#中的协变与逆变。
//空间
namespace ConsoleApplication1
{
//基类
class Animal { public int legs = 4; public string Name = "tomhuy"; };
//继承类
class Dog : Animal { }
//协变委托
delegate T Factry<out T>();
//逆变委托
delegate void Action1<in T>(T a);
//协变接口
interface IMyIfc<out T> { T GetFirst(); }
//继承接口类
class SimpleReturn<T>: IMyIfc<T>
{
public T[] items = new T[2];
public T GetFirst() { return items[0]; }
}
//主程序
class Program
{
//静态函数
static Dog MakeDog() { return new Dog(); }
//静态空函数
static void MakeAnimal(Animal a) { Console.WriteLine(a.legs); }
//静态空函数
static void DoSomething(IMyIfc<Animal> returner)
{
Console.WriteLine(returner.GetFirst().Name);
}
//主程序入口
static void Main(string[] args)
{
//协变委托实例
Factry<Dog> dogMake = MakeDog;
Factry<Animal> animalMake = dogMake;
//逆变委托实例
Action1<Animal> makeanimal = MakeAnimal;
Action1<Dog> makedog = makeanimal;
//接口协变实例
SimpleReturn<Dog> dogReturn = new SimpleReturn<Dog>();
dogReturn.items[0] = new Dog() { Name = "zhangshan" };
IMyIfc<Animal> animalReturn = dogReturn;
//控制台协变输出
Console.WriteLine(dogMake().legs.ToString());
Console.WriteLine(animalMake().legs.ToString());
//控制台逆变输出
makedog(new Dog());
makeanimal(new Animal());
makeanimal(new Dog());
//控制台协变输出
DoSomething(dogReturn);
}
}
}
652f5ba1-3407-4d4a-8d0c-d63879df1362|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: 代码, 接口, C#, 泛型, 类, 方法, 程序
IT技术