2009-09-26 15 views

Respuesta

2

El `1 es la sintaxis de MSIL para un tipo genérico - List<T> es específico de C#. Más ejemplos: MSIL

List<T> == System.Collections.Generic.List`1 
List<string> == System.Collections.Generic.List`1[System.String] 
Dictionary<string, int> == 
    System.Collections.Generic.Dictionary`2[System.String, System.Int32] 
+0

Creo que no entendió el punto. \ '1 no define una clase genérica para el CLR. En el nivel de IL, una clase genérica puede ser nombrada arbitrariamente. Es un método para resolver ambigüedades entre tipos genéricos sobrecargados para idiomas de nivel superior. Declara el número de parámetros de tipo para el tipo para que pueda sobrecargar los tipos por el número de parámetros genéricos. Tu ejemplo es incorrecto 'Dictionary ' es Dictionary \ '2 [System.String, System.Int32], no Dictionary \' 1, ya que tiene ** dos ** parámetros de tipo. –

+0

whoops, typo. Fijo. – thecoop

8

El nombre CLR para genérico List<T> con un parámetro tipo es

System.Collections.Generic.List`1 

List<T> es el # estilo C de nombrar ese tipo.

La notación es una convención definida para darle la capacidad de sobrecargar los tipos genéricos por conteo de parámetros. Si declara una clase llamada List con dos parámetros de tipo (por ejemplo, List<T,U>), el compilador podría elegir la correcta. Va a ser nombrado:

System.Collections.Generic.List`2 

y una clase no genérica List se llamará:

System.Collections.Generic.List 

Tenga en cuenta que el CLR no requieren tipos genéricos para ser nombrado por el estilo. Es solo una convención para que los compiladores puedan elegir el tipo correcto.

+0

yo pensamos que la CLI no borró tipos genéricos? Si no, ¿dónde se encuentra "Cadena" cuando "Lista " se convierte en Lista'1? –

+2

'List ' se convierte en List \ '1. Es la "definición de tipo genérico abierto". La definición cerrada de 'List ' se convertirá en List \ '1 [System.String]. –

+0

+1 para el punto que el CLR no _require_ esto. –

4

No muestra List<string> porque eso es sintaxis dependiente de C#. Una lista en el código fuente de .Net podría declararse como List<string>, List(Of String) o cualquiera de los otros 60 idiomas o sintaxis que pueden compilarse hasta MSIL.

Entonces, lo que está viendo es la sintaxis MSIL más genérica.

El `1 significa que es una lista que tiene un parámetro genérico.

Cuestiones relacionadas