2012-04-05 18 views
19

he acabo de ver una sintaxis poco familiar en la búsqueda de GroupBy tipo de retorno:¿Qué significa "salir" antes de un parámetro de tipo genérico?

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

MSDN Source

sé qué significa out en los métodos, pero no en una interfaz genéricos.

¿Qué significa out en un tipo genérico?

+1

Es un * Modificador genérico *. Vea MSDN http://msdn.microsoft.com/en-us/library/dd469487.aspx –

+3

con 12k rep no puede mirar al menos [MSDN] (http://msdn.microsoft.com/en-us/library/ dd469487.aspx) antes de preguntar? – Reniuz

+0

@Reniuz. Encontré solo la referencia 'out'. Lo siento ... – gdoron

Respuesta

9

Es uno de los dos modificadores genéricos que se presenta en C# 4.0 (Visual Studio 2010).

Significa que el parámetro genérico en el que se declara es covariante.

El modificador in significa que el parámetro genérico en el que se declara es contravariante.

Consulte out (Generic Modifier) y in (Generic Modifier) en MSDN.

+0

Sé los términos [contravarianza y covarianza] (http://msdn.microsoft.com/en-us/library/ee207183.aspx), pero el Los ejemplos de MSDN no describen los modificadores 'in' y' out' para Generics muy claros en mi opinión. ¿Puedes dar algunos ejemplos que sean más fáciles de entender? – Matt

+1

Esto no es más que copiar/pegar desde MSDN. La respuesta de Frank debería haber sido aceptada, no esto. –

+0

@SergeyAkopov - Ciertamente tiene derecho a su opinión, pero aceptarla o no aceptarla es algo que la persona que pregunta decide. – Oded

5

a cabo sólo significa que el tipo sólo se utiliza para la producción, por ejemplo,

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

También hay un modificador en eso significa que el tipo solo se usa para la entrada, p.

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

Estos se utilizan porque Interfaces con en son covariantes en T e interfaces con a cabo son contravariant en T.

+0

Supongo que quería decir 'interfaz pública Foo ' (en lugar de 'salir') en su segundo ejemplo, ¿estoy en lo cierto? – Matt

+0

@Matt Oops, tienes razón. Gracias, arreglado ahora. –

+0

@ralzarek lo tienes al revés: sale covariante y es contravariante – BaltoStar

14

Denota un parámetro covariant. Consulte también la descripción en MSDN. Esencialmente se dice, que IGrouping<Aderived, Bderived> puede ser considerado como IGrouping<Abase, Bbase>, por lo tanto, se puede

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

si Aderived es una interfaz o un tipo derivado de Abase. Esta es una característica que es útil cuando se quiere llamar a un método que requiere un parámetro del tipo IGrouping<Abase, Bbase>, pero solo se obtiene un objeto de tipo IGrouping<Aderived, Bderived>. En este caso, ambos tipos pueden considerarse equivalentes debido a la covarianza de sus parámetros de tipo.

Cuestiones relacionadas