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

问题描述 投票:0回答:4

我刚刚在寻找

GroupBy
返回类型时看到了一个不熟悉的语法:

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

MSDN 来源

我知道

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

out
在泛型类型中意味着什么?

c# .net generics c#-3.0
4个回答
18
投票

它表示一个协变参数。另请参阅 MSDN 上的说明。本质上它说,

IGrouping<Aderived, Bderived>
可以被视为
IGrouping<Abase, Bbase>
,因此你可以

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

if

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


8
投票

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

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

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

请参阅 MSDN 上的 out(通用修饰符)in(通用修饰符)


4
投票
在此上下文中,

out
关键字表示相应的类型参数是协变的,简单来说 - 协变使您能够使用比泛型参数指定的派生类型更多的类型。

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


4
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.