泛型类型参数之前的“out”是什么意思
本文关键字:是什么 意思 out 泛型类型参数 | 更新日期: 2023-09-27 18:30:21
我刚刚在寻找返回类型时看到了一种不熟悉GroupBy
语法:
public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>
MSDN 源
我知道out
方法中的含义,但在泛型接口中却不是什么意思。
泛型类型中out
是什么意思?
它表示协变参数。另请参阅 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>
类型的对象。在这种情况下,由于类型参数的协方差,可以将这两种类型视为等效。
C# 4.0 (Visual Studio 2010) 中引入的两个泛型修饰符之一。
它表示声明它的泛型参数是协变的。
in
修饰符表示声明它的泛型参数是逆变的。
请参阅 MSDN 上的 (通用修饰符) 和 (泛型修饰符)。
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