首页 > Linux操作系统 > Linux操作系统 > .NET泛型中的协变与逆变
类型参数可由关键字“In”和“Out”修饰。“In”类型只能作为方法参数。与此类似,“Out”类型只能作为方法的返回类型。
使用Out类型的一个例子就是IEnumerable(Of T)。如果某函数接受一个IEnumerable(Of Animal)类型参数,那么我们就可以给它传一个IEnumerable(of Bird)。对于In类型,一个不太恰当的例子就是顺序。看一下下面的接口:
Interface IWriter(Of T) Write(value As T)
如果你向接受Writer(Of Animal)类型参数的函数传一个IWriter(Of Bird),当然就不对了。该方法可以将Animal的任何子类传给IWriter.Write,但是它只接受Birds。
如果使用注解,该接口看起来像下面这样:
Interface IEnumerable(Of Out T)Interface IWriter(Of In T)
这是针对VB编写的,它也可以用在C#上。
interface IEnumerableinterface IWriter
不幸的是,这种语法并不能直接应用在大多数常见的场景中。比如IList(Of T),当传给一个向集合中写入的方法时,T应该是In类型。但是当传给一个从集合中读取的方法时,T应该是Out类型。或许这里应该针对IList创建一个基类,该类会将接受T与返回T的方法区分开来。
追溯过去,C#和VB都支持数组协变(out/IEnumerable情况),尽管在逆变的情况下这会导致运行时错误(in/IWriter情况)。这样做的目的是使C#更兼容于Java。大多数人都认为这是一个不好的设计,但是现在却无法改变了。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-541454/,如需转载,请注明出处,否则将追究法律责任。