我在查找GroupBy
返回类型时看到了一种不熟悉的语法:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
我知道out
在方法中的意义,但不是在泛型界面中。
out
在泛型类型中的含义是什么?
答案 0 :(得分:15)
它表示covariant参数。另请参阅MSDN上的说明。基本上它说,IGrouping<Aderived, Bderived>
可以被视为IGrouping<Abase, Bbase>
,因此你可以
IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;
如果Aderived
是接口或从Abase
派生的类型。当您想要调用需要类型为IGrouping<Abase, Bbase>
的参数的方法时,此功能会派上用场,但您只能获得类型为IGrouping<Aderived, Bderived>
的对象。在这种情况下,由于类型参数的协方差,两种类型都可以被认为是等价的。
答案 1 :(得分:9)
它是C#4.0(Visual Studio 2010)中引入的两个通用修饰符之一。
它表示声明的泛型参数是协变的。
in
修饰符表示声明的泛型参数是逆变的。
答案 2 :(得分:5)
out只表示该类型仅用于输出,例如
public interface Foo<out T>
{
T Bar()
}
还有一个修饰符,意味着该类型仅用于输入,例如
public interface Foo<in T>
{
int Bar(T x)
}
使用这些是因为带有in的接口在T中是协变的,而带有out的接口在T中是逆变的。
答案 3 :(得分:4)
out
关键字将指示相应的类型参数,只需说明协变 - 协方差使您可以使用比泛型参数指定的更多派生类型。