说白了,就是为了让泛型也能搞工厂模式。   

 

显然第二行的object到string是非类型安全的,那为什么第四行的object到string就是类型安全的呢?
结合上一个方法体的示例,来看这段代码:

[C#]浅谈协变与逆变
1 Action<List<int>> myAction = new Action<IList<int>>(
2     (list) =>
3     {
4         Console.WriteLine(list.Count);
5     });
6 myAction(new List<int> {1, 2, 3});
[C#]浅谈协变与逆变

第一行貌似是把IList转换成了List,但是实际上是这样的:
第六行传入的实参是一个List,进入方法体,List被转换成了IList,然后使用了IList的Count属性。
所以传参的时候其实发生的是派生类到基类的转换,自然也就是类型安全的了。

List<string>到IEnumerable<object>的协变其实也是类似的过程:

[C#]浅谈协变与逆变
 1 IEnumerable<Delegate> myEnumerable = new List<Action>
 2 {
 3     new Action(()=>Console.WriteLine(1)),
 4     new Action(()=>Console.WriteLine(2)),
 5     new Action(()=>Console.WriteLine(3)),
 6 };
 7 foreach (Delegate dlgt in myEnumerable)
 8 {
 9     dlgt.DynamicInvoke();
10 }
[C#]浅谈协变与逆变

实参是三个Action,调用的是Delegate的DynamicInvoke方法,完全的类型安全转换。

 

最后想说的是,所有死记硬背来的知识,都远远不如充分理解的知识来得可靠。

相关文章:

  • 2021-12-23
  • 2018-06-25
  • 2021-08-14
  • 2021-07-22
  • 2021-10-27
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-08-19
  • 2021-09-14
  • 2021-09-14
  • 2021-09-01
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案