簡體   English   中英

通用類型參數前的“out”是什么意思?

[英]What does "out" mean before a Generic type parameter?

我剛剛在尋找GroupBy返回類型時看到了一個不熟悉的語法:

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

MSDN 源

我知道out在方法中是什么意思,但在 generics 接口中不知道。

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>類型的 object。 在這種情況下,由於類型參數的協變性,兩種類型都可以被認為是等價的。

它是 C# 4.0 (Visual Studio 2010) 中引入的兩個通用修飾符之一。

它表示聲明它的泛型參數是協變的。

in修飾符表示聲明它的泛型參數是逆變的。

請參閱 MSDN 上的(Generic Modifier)in (Generic Modifier)

out 只是表示該類型僅用於 output 例如

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM