在Generic类型参数之前,“out”是什么意思?

我在寻找GroupBy返回类型时看到了一种不熟悉的语法:

 public interface IGrouping : IEnumerable 

MSDN来源

我知道方法中有什么意思,但不是在generics界面中。

generics中的含义是什么?

它是C#4.0(Visual Studio 2010)中引入的两个通用修饰符之一。

它表示声明的generics参数是协变的。

in修饰符表示声明的generics参数是逆变量。

在MSDN上查看(通用修饰符)和(通用修饰符) 。

它表示协变参数。 另请参阅MSDN上的说明。 基本上它说, IGrouping可以被视为IGrouping ,因此你可以

 IGrouping gr = MakeGrouping(...); IGrouping grBase = gr; 

如果Aderived是一个接口或派生自Abase的类型。 当您想要调用需要IGrouping类型的参数的方法时,这个function会派上用场,但您只能获得IGrouping类型的对象。 在这种情况下,由于类型参数的协方差,两种类型都可以被认为是等价的。

out只表示该类型仅用于输出,例如

 public interface Foo { T Bar() } 

还有一个修饰符,意味着该类型仅用于输入,例如

 public interface Foo { int Bar(T x) } 

之所以使用这些是因为带有in的接口在T中是协变的,而带有out的接口在T中是逆变的。

在这种情况下, out关键字表示相应的类型参数只是协变 – 协方差使您能够使用比generics参数指定的更多派生类型。

顺便说一句,请参阅Eric Lippert的这十部分系列文章,了解有关协方差和反差的更多信息: http : //blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-convvariance-in- C-部分one.aspx