我刚刚在寻找GroupBy
返回类型时看到了一个不熟悉的语法:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
我知道out
方法中的含义,但不知道泛型接口中的含义。
out
泛型类型是什么意思?
它表示协变参数。另请参阅MSDN上的说明。本质上它说,那IGrouping<Aderived, Bderived>
可以被视为IGrouping<Abase, Bbase>
,因此你可以
IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;
ifAderived
是一个接口或派生自的类型Abase
。当您想要调用需要类型参数的方法IGrouping<Abase, Bbase>
但您只有一个类型的对象时,此功能会派上用场IGrouping<Aderived, Bderived>
。在这种情况下,由于它们的类型参数的协方差,这两种类型可以被认为是等价的。
它是 C# 4.0 (Visual Studio 2010) 中引入的两个通用修饰符之一。
它表示它所声明的泛型参数是协变的。
修饰符表示它所声明的in
泛型参数是逆变的。
请参阅MSDN 上的(Generic Modifier)和in (Generic Modifier) 。
out 仅表示该类型仅用于输出,例如
public interface Foo<out T>
{
T Bar()
}
还有一个修饰符意味着该类型仅用于输入,例如
public interface Foo<in T>
{
int Bar(T x)
}
使用这些是因为带有 in 的接口在 T 中是协变的,而没有 out 的接口在 T 中是逆变的。
out
简单地说,在这种情况下,关键字将指示相应的类型参数是协变的 - 协变使您能够使用比泛型参数指定的类型更多的派生类型。
顺便说一句,请参阅 Eric Lippert 的这十部分系列,以了解有关协方差和逆变的更多信息:http: //blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in- c-part-one.aspx