泛型的可变性分析

复制代码
 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 }
复制代码

 

posted on   阿水  阅读(200)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示