zoukankan      html  css  js  c++  java
  • 泛型的可变性分析

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading.Tasks;
     6 
     7 namespace GenericTest
     8 {    
     9     class Program
    10     {
    11         /// <summary>
    12         /// 
    13         /// </summary>
    14         /// <param name="args"></param>
    15         static void Main(string[] args)
    16         {
    17                            
    18         }
    19 
    20         /// <summary>
    21         /// 泛型协变和逆变的代码示例
    22         /// 用最简单的代码解释问题
    23         /// 协变 和 逆变 其实过程基本一致 本示例使用委托 一下都是针对委托
    24         /// 1:声明源方法,委托实例化 用Source表示
    25         /// 2:声明目标用Destination 指向 Source
    26         /// 3:调用!!!重要 如果不调用 就不能彻底的理解 泛型的可变性
    27         /// 所有的转变都发生在调用的时候,通过分析调用过程能够理解泛型的可变性
    28         /// 
    29         /// 通过以上步骤,分析具体代码加强泛型可变性的理解
    30         /// </summary>
    31         public static void GenericVariant()
    32         {
    33             //协变
    34             //声明源方法,委托实例化 用Source表示
    35             Func<string> funcSource = () => "generic variant";
    36             //声明目标用Destination表示 并进行委托转换 Source->Destination
    37             Func<object> funcDestination = funcSource;
    38 
    39             //调用
    40             //调用过程 实际是调用了 funcSource 返回了 string 值
    41             //变变变 发生在 从String 的返回值 转换成了Object
    42             //注意 out 参数转变方向是 Source -> Destination
    43             object result = funcDestination();
    44             //string result = funcDestination();
    45 
    46             //逆变
    47             //声明源方法,委托实例化 用Source表示 输入参数为object
    48             Action<object> actionSource = arg => { Console.Write(arg.ToString()); };
    49             //声明目标用Destination表示 并进行委托转换 Source->Destination
    50             Action<string> actionDestination = actionSource;
    51             //调用
    52             //变变变 发生在 从String 的输入参数 转换成了Object
    53             //调用过程 实际是调用了 funcSource 返回了 输入参数为object 值         
    54             //注意 in参数转变方向是 Destination -> Source 
    55             //actionDestination(new object());
    56             actionDestination("abc");
    57             /*
    58              out 针对返回值 所以 转变方向为 source => destination
    59              in   针对输入参数,所以转变方向为 destination =>source
    60              其实 协变、逆变都是类型安全的转变
    61              */
    62 
    63         }
    64     }
    65 }
  • 相关阅读:
    c++ 两个set合并
    L2-2 小字辈 (25 分)
    L1-1 天梯赛座位分配
    c++ 用 0x3f3f3f3f 设定最大int值的优点
    Treap(树堆)(转)
    new一个二维数组(转)
    Laplacian matrix(转)
    寒假计划制定
    寒假集训日志(八,九,十)——浪浪浪
    寒假集训日志(七)——数据结构
  • 原文地址:https://www.cnblogs.com/byrybye/p/6346652.html
Copyright © 2011-2022 走看看