我刚刚在寻找
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;
if
Aderived
是从 Abase
派生的接口或类型。当您想要调用需要 IGrouping<Abase, Bbase>
类型的参数的方法,但只有一个 IGrouping<Aderived, Bderived>
类型的对象时,此功能会派上用场。在这种情况下,由于类型参数的协方差,两种类型都可以被认为是等效的。
它是 C# 4.0 (Visual Studio 2010) 中引入的两个通用修饰符之一。
它表示声明它的泛型参数是协变的。
in
修饰符表示声明它的泛型参数是逆变的。
请参阅 MSDN 上的 out(通用修饰符) 和 in(通用修饰符)。
out
关键字表示相应的类型参数是协变的,简单来说 - 协变使您能够使用比泛型参数指定的派生类型更多的类型。
顺便说一句,请参阅 Eric Lippert 的这十部分系列,了解有关协方差和逆变的更多信息:http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance- in-c-part-one.aspx
out 只是表示该类型仅用于输出,例如
public interface Foo<out T>
{
T Bar()
}
还有一个修饰符,这意味着该类型仅用于输入,例如
public interface Foo<in T>
{
int Bar(T x)
}
使用这些是因为带有 in 的接口在 T 中是协变的,而没有 out 的接口在 T 中是逆变的。