2012-04-05 99 views
19

我剛剛看到一個不熟悉的語法,同時尋找GroupBy返回類型:在一個泛型接口在「泛型」類型參數之前,「out」是什麼意思?

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

MSDN Source

我知道這是什麼意思out的方法,但不是。

out在泛型中的含義是什麼?

+1

這是一個*通用修飾符*。請參閱MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx – 2012-04-05 11:24:20

+3

與12k代表至少看[MSDN](http://msdn.microsoft.com/en-us/library/ dd469487.aspx)之前問? – Reniuz 2012-04-05 11:24:54

+0

@Reniuz。我發現那裏只有'out'參考。對不起...... – gdoron 2012-04-05 11:25:52

回答

9

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

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

in修飾符表示其聲明的通用參數是逆變。

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

+0

我知道術語[反向和協方差](http://msdn.microsoft.com/en-us/library/ee207183.aspx),但在我看來,MSDN的例子並沒有描述泛型的'in'和'out'修飾符。你能舉出一些比較容易理解的例子嗎? – Matt 2012-12-14 09:47:24

+1

這只不過是從MSDN複製/粘貼而已。弗蘭克的答案應該被接受,而不是這個。 – 2013-02-21 20:06:33

+0

@SergeyAkopov - 你當然有資格接受你的意見,但接受與否完全是問題提供者決定的事情。 – Oded 2013-02-21 20:07:46

5

出只是意味着該類型僅用於輸出例如

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

這裏還有一個修飾詞,表示該類型僅用於輸入,例如,

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

這些使用,因爲在接口T中是協變,並與出接口是逆變在T.

+0

我假設你在第二個例子中的意思是'public interface Foo '(而不是'out'),對嗎? – Matt 2012-12-14 09:43:28

+0

@Matt哎呀,你是對的。謝謝,現在修復。 – 2012-12-14 09:59:25

+0

@ralzarek你有它倒退:out是協變和in是逆變的 – BaltoStar 2017-07-17 18:14:30

14

它表示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>類型的對象。在這種情況下,由於類型參數的協方差,兩種類型都可以被認爲是等價的。

相關問題