|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能天天有学习.net),我一同学说,你应该早就有作品啦。我惶惶然……以后.NET言语如VB和C#还不撑持泛型的协变(covariance)与逆变(contravariance)。只管微软中的良多人也在议论它,可是在不远的未来这仍是不太大概呈现。对协变与逆变的完全先容要花很长工夫。基于此,请人人参考EricLippert的关于C#中的协变与逆变的系列文章。为了在VB中增添协变与逆变的泛型撑持,LucianWischik提出了上面的语法。
范例参数可由关头字“In”和“Out”润色。“In”范例只能作为办法参数。与此相似,“Out”范例只能作为办法的前往范例。
利用Out范例的一个例子就是IEnumerable(OfT)。假如某函数承受一个IEnumerable(OfAnimal)范例参数,那末我们就能够给它传一个IEnumerable(ofBird)。关于In范例,一个不太得当的例子就是按次。看一下上面的接口:- InterfaceIWriter(OfT)Write(valueAsT)
复制代码 假如你向承受Writer(OfAnimal)范例参数的函数传一个IWriter(OfBird),固然就不合错误了。该办法能够将Animal的任何子类传给IWriter.Write,可是它只承受Birds。
假如利用注解,该接口看起来像上面如许:- InterfaceIEnumerable(OfOutT)InterfaceIWriter(OfInT)
复制代码 这是针对VB编写的,它也能够用在C#上。- interfaceIEnumerable<outT>interfaceIWriter<inT>
复制代码 不幸的是,这类语法其实不能间接使用在年夜多半罕见的场景中。好比IList(OfT),当传给一个向汇合中写进的办法时,T应当是In范例。可是当传给一个从汇合中读取的办法时,T应当是Out范例。也许这里应当针对IList创立一个基类,该类会将承受T与前往T的办法辨别开来。
追溯已往,C#和VB都撑持数组协变(out/IEnumerable情形),只管在逆变的情形下这会招致运转时毛病(in/IWriter情形)。如许做的目标是使C#更兼容于Java。年夜多半人都以为这是一个欠好的计划,可是如今却没法改动了。
检察英文原文:CovarianceandContravariancein.NETGenerics
来自:http://www.infoq.com/cn/news/2008/08/GenericVariance
语言是不是不是最重要的? |
|