2012-04-05 8 views
19

Ho appena visto una sintassi familiare, mentre cerca di tipo GroupBy ritorno:Che cosa significa "out" prima di un parametro di tipo generico?

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

MSDN Source

So cosa vuol dire out nei metodi, ma non in un'interfaccia farmaci generici.

Che cosa significa out in un tipo generico?

+1

È un * modificatore generico *. Vedere MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx –

+3

con 12k rep non riesaminare almeno [MSDN] (http://msdn.microsoft.com/en-us/library/ dd469487.aspx) prima di chiedere? – Reniuz

+0

@Reniuz. Ho trovato solo il riferimento 'out'. Mi spiace ... – gdoron

risposta

9

È uno dei due modificatori generici introdotti in C# 4.0 (Visual Studio 2010).

Significa che il parametro generico dichiarato è covariante.

Il modificatore in indica che il parametro generico dichiarato è controverso.

Vedere out (Generic Modifier) e in (Generic Modifier) su MSDN.

+0

Conosco i termini [controvarianza e covarianza] (http://msdn.microsoft.com/en-us/library/ee207183.aspx), ma il Gli esempi MSDN non descrivono i modificatori 'in' e' out' per Generics molto chiari a mio parere. Puoi dare alcuni esempi che sono più facili da capire? – Matt

+1

Questo non è altro che copia/incolla da MSDN. La risposta di Frank avrebbe dovuto essere accettata, non questo. –

+0

@SergeyAkopov - Hai certamente diritto alla tua opinione, ma accettare o meno è interamente qualcosa che decide il richiedente. – Oded

5

fuori significa semplicemente che il tipo viene utilizzato solo per l'uscita ad esempio

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

C'è anche un modificatore che significa che il tipo viene utilizzato solo per l'input, ad es.

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

presentate utilizzato perché Interfacce con in covariante sono in T ed interfacce con fuori sono contravariant in T.

+0

Suppongo che intendessi "interfaccia pubblica Foo " (invece di "out") nel tuo secondo esempio, vero? – Matt

+0

@Matt Oops, hai ragione. Grazie, ora risolto. –

+0

@ralzarek lo hai indietro: out è covariante e in è controvariante – BaltoStar

14

Si denota un parametro covariant. Vedi anche la descrizione su MSDN. Essenzialmente si dice, che IGrouping<Aderived, Bderived> può essere considerato come IGrouping<Abase, Bbase>, quindi è possibile

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

se Aderived è un'interfaccia o un tipo derivato da Abase. Questa è una funzionalità che è utile quando si desidera chiamare un metodo che richiede un parametro di tipo IGrouping<Abase, Bbase>, ma si ottiene solo un oggetto di tipo IGrouping<Aderived, Bderived>. In questo caso, entrambi i tipi possono essere considerati equivalenti a causa della covarianza dei loro parametri di tipo.

Problemi correlati