/// <summary> /// 泛型协变和逆变的代码示例 /// 用最简单的代码解释问题 /// 协变 和 逆变 其实过程基本一致 本示例使用委托 一下都是针对委托 /// 1:声明源方法,委托实例化 用Source表示 /// 2:声明目标用Destination 指向 Source /// 3:调用!!!重要 如果不调用 就不能彻底的理解 泛型的可变性 /// 所有的转变都发生在调用的时候,通过分析调用过程能够理解泛型的可变性 /// /// 通过以上步骤,分析具体代码加强泛型可变性的理解 /// </summary> public static void GenericVariant() { //协变 //声明源方法,委托实例化 用Source表示 Func<string> funcSource = () => "农码一生"; //声明目标用Destination表示 并进行委托转换 Source->Destination Func<object> funcDestination = funcSource; //调用 //调用过程 实际是调用了 funcSource 返回了 string 值 //变变变 发生在 从String 的返回值 转换成了Object //注意 out 参数转变方向是 Source -> Destination object result = funcDestination(); //string result = funcDestination(); //逆变 //声明源方法,委托实例化 用Source表示 输入参数为object Action<object> actionSource = arg => { Console.Write(arg.ToString()); }; //声明目标用Destination表示 并进行委托转换 Source->Destination Action<string> actionDestination = actionSource; //调用 //变变变 发生在 从String 的输入参数 转换成了Object //调用过程 实际是调用了 funcSource 返回了 输入参数为object 值 //注意 in参数转变方向是 Destination -> Source //actionDestination(new object()); actionDestination("abc"); /* out 针对返回值 所以 转变方向为 source => destination in 针对输入参数,所以转变方向为 destination =>source 其实 协变、逆变都是类型安全的转变 */ }
原文:http://www.cnblogs.com/byrybye/p/6346652.html