当前位置:  开发笔记 > 编程语言 > 正文

如何在C#4.0中实现通用协方差和Contra-variance?

如何解决《如何在C#4.0中实现通用协方差和Contra-variance?》经验,为你挑选了2个好方法。

我没有参加PDC 2008,但我听到一些消息称C#4.0被宣布支持Generic协方差和反差异.也就是说,List可以分配给List.怎么会这样?

在Jon Skeet的C#深度书中,解释了为什么C#泛型不支持协方差和反方差.它主要用于编写安全代码.现在,C#4.0改为支持它们.它会带来混乱吗?

有人知道有关C#4.0的细节可以给出一些解释吗?



1> Jon Skeet..:

差异只会以安全的方式得到支持- 事实上,使用CLR已有的能力.因此,我在试图使用a List作为List(或其他任何东西)的书中给出的例子仍然不起作用 - 但是其他一些场景也会如此.

首先,它仅支持接口和委托.

其次,它要求接口/委托的作者将类型参数装饰为in(用于逆变)或out(用于协方差).最明显的例子是IEnumerable它只允许你"取出"它的值 - 它不会让你添加新的值.那将成为IEnumerable.这根本不会损害类型安全性,但允许您IEnumerable从声明为返回的方法返回一个IEnumerable.

使用接口更难以给出具体的示例,但是委托代表很容易.考虑一下Action- 它只代表一个带T参数的方法.这将是很好的能够无缝地转换使用的Action作为Action-这需要的任何方法object的参数是怎么回事时,它提出了一个要罚款string代替.当然,C#2在某种程度上已经具有代表的协方差和逆变,但是通过从一个委托类型到另一个委托类型的实际转换(创建新实例) - 参见P141-144的示例.C#4将使这更通用,并且(我相信)将避免为转换创建新实例.(这将是一个参考转换.)

希望这有点清除 - 如果没有意义,请告诉我!


再次,你在SO上的一个答案立即帮助我改进了一些代码.谢谢!
那么,是否意味着如果该类被声明为"List "那么它应该没有像"void Add(T obj)"这样的成员函数?C#4.0编译器会报告错误,对吗?

2> kemiller2002..:

并不是说Jon还没有涵盖它,但这里有一些来自Eric Lippert的博客和视频的链接.他用一些例子做了很好的解释.

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

视频:

https://www.youtube.com/watch?v=3MQDrKbzvqU

https://www.youtube.com/watch?v=XRIadQaBYlI

https://www.youtube.com/watch?v=St9d2EDZfrg

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有