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

为什么我们需要在C#中使用协方差和反差异的新关键字?

如何解决《为什么我们需要在C#中使用协方差和反差异的新关键字?》经验,为你挑选了3个好方法。

有人可以解释为什么需要添加out或in参数来表示泛型类型是C#4.0中的Co或Contra变体吗?

我一直在努力理解为什么这很重要,以及编译器为什么不能弄清楚它...

谢谢,

玩笑



1> Joel Coehoor..:

从事语言工作的Eric Lippert在msdn上发布了一系列帖子,有助于澄清所涉及的问题:http:
//blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

阅读该链接中显示的文章时,从底部开始进行操作.

最终你会到达#7(为什么我们需要一个语法?).



2> James Curran..:

我们实际上并不需要他们,更多的则需要我们abstract对类或两者outref.它们的存在只是为了让我们作为程序员能够清楚地表达我们的意图,以便维护程序员知道我们在做什么,并且编译器可以验证我们正在做的事情.



3> Edward KMETT..:

那么,主要的问题是,如果你有一个类层次结构,如:

   class Foo { .. } 

   class Bar : Foo { .. } 

你有一个IEnumerator,你不能使用它作为一个IEnumerator即使这是非常安全的.在3.5中,这会导致大量痛苦的回转.此操作始终是安全的,但类型系统拒绝该操作,因为它不知道泛型类型参数的协变使用.IEnumerator只能返回一个Bar而且每个Bar都是一个Foo.

类似地,如果你有一个IEqualityComparer它可以用来比较任何类型的对象,Foo即使其中一个或两个是a Bar,但它不能被转换为a ,IEqualityComparer因为它不知道泛型类型参数的逆变使用.IEqualityComparer只消耗类型的对象,Foo每个Bar都是一个Foo.

如果没有这些关键字,我们不得不假设泛型参数既可以作为方法的参数,也可以作为方法的结果类型,因此我们无法安全地允许上述任何一种转换.

有了它们,类型系统可以自由地允许我们按照关键字指示的方向安全地在这些接口之间进行向上和向下转换,并且我们得到错误,指示何时违反确保安全所需的规则.

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