泛型类型参数之前的“out”是什么意思

本文关键字:是什么 意思 out 泛型类型参数 | 更新日期: 2023-09-27 18:30:21

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

public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>

MSDN 源

我知道out方法中的含义,但在泛型接口中却不是什么意思。

泛型类型中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