首页 > 其他 > 详细

泛型的可变性分析

时间:2017-01-24 12:21:34      阅读:163      评论:0      收藏:0      [点我收藏+]
/// <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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!