/// <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