在Generic类型参数之前,“out”是什么意思?

时间:2012-04-05 11:21:34

标签: c# .net generics compiler-construction c#-3.0

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

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

MSDN Source

我知道out在方法中的意义,但不是在泛型界面中。

out在泛型类型中的含义是什么?

4 个答案:

答案 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修饰符表示声明的泛型参数是逆变的。

在MSDN上查看out (Generic Modifier)in (Generic Modifier)

答案 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关键字将指示相应的类型参数,只需说明协变 - 协方差使您可以使用比泛型参数指定的更多派生类型。

BTW,请参阅Eric Lippert的十部分系列文章,了解有关协方差和反方差的更多信息:http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part-one.aspx