21

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

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

MSDN 源

我知道out方法中的含义,但不知道泛型接口中的含义。

out泛型类型是什么意思?

4

4 回答 4

18

它表示协变参数。另请参阅MSDN上的说明。本质上它说,那IGrouping<Aderived, Bderived>可以被视为IGrouping<Abase, Bbase>,因此你可以

IGrouping<Aderived, Bderived> gr = MakeGrouping(...);
IGrouping<Abase, Bbase> grBase = gr;

ifAderived是一个接口或派生自的类型Abase。当您想要调用需要类型参数的方法IGrouping<Abase, Bbase>但您只有一个类型的对象时,此功能会派上用场IGrouping<Aderived, Bderived>。在这种情况下,由于它们的类型参数的协方差,这两种类型可以被认为是等价的。

于 2012-04-05T11:29:20.073 回答
8

它是 C# 4.0 (Visual Studio 2010) 中引入的两个通用修饰符之一。

它表示它所声明的泛型参数是协变的。

修饰符表示它所声明的in泛型参数是逆变的。

请参阅MSDN 上的(Generic Modifier)in (Generic Modifier) 。

于 2012-04-05T11:27:23.790 回答
5

out 仅表示该类型仅用于输出,例如

public interface Foo<out T>
{
   T Bar()
}

还有一个修饰符意味着该类型仅用于输入,例如

public interface Foo<in T>
{
    int Bar(T x)
}

使用这些是因为带有 in 的接口在 T 中是协变的,而没有 out 的接口在 T 中是逆变的。

于 2012-04-05T11:28:38.017 回答
4

out简单地说,在这种情况下,关键字将指示相应的类型参数是协变的 - 协变使您能够使用比泛型参数指定的类型更多的派生类型。

顺便说一句,请参阅 Eric Lippert 的这十部分系列,以了解有关协方差和逆变的更多信息:http: //blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in- c-part-one.aspx

于 2012-04-05T11:27:42.500 回答