¿Y por qué no muestra el tipo real (por ejemplo: List <string> en vez de List`1)?
¿De dónde viene esta extraña notación (para mí)?¿Por qué el tiempo de ejecución muestra los tipos genéricos como "GenericType`n"?
Respuesta
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]
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.
yo pensamos que la CLI no borró tipos genéricos? Si no, ¿dónde se encuentra "Cadena" cuando "Lista
'List
+1 para el punto que el CLR no _require_ esto. –
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.
- 1. Coerción en tiempo de ejecución de tipos genéricos en F #
- 2. ¿Por qué C# prohíbe los tipos de atributos genéricos?
- 3. genéricos C# - posible crear un método con n tipos genéricos ..?
- 4. Enumere los tipos cerrados que el tiempo de ejecución ha creado a partir de los tipos genéricos abiertos
- 5. ¿Por qué no se borran todos los tipos de información en Java en tiempo de ejecución?
- 6. ¿Por qué no se pueden inferir los tipos genéricos anidados?
- 7. ¿Qué razones existen para las diferencias entre los tipos de tiempo de compilación y los tipos de tiempo de ejecución?
- 8. C# Pass genéricos en tiempo de ejecución
- 9. C# ¿Por qué no se pueden pasar los tipos genéricos como parámetros?
- 10. ¿No puede ser tan específico con los tipos de campos genéricos de Java como con los tipos de métodos genéricos?
- 11. Funciones con los tipos de parámetros genéricos
- 12. genéricos dinámicos en tiempo de ejecución utilizando la reflexión
- 13. ¿Por qué C# no infiere mis tipos genéricos?
- 14. operador implícito sobre los tipos genéricos
- 15. ¿Por qué NumberFormatException es el tiempo de ejecución?
- 16. Verificación del valor por defecto utilizando los tipos genéricos
- 17. ¿Cuándo debería encapsular los tipos genéricos?
- 18. ¿Por qué CheckBoxFor produce el error de tiempo de ejecución?
- 19. ¿Por qué no se reifican los parámetros de tipo genérico de Java en tiempo de ejecución?
- 20. Colección de tipos genéricos
- 21. Java tipos genéricos y de matriz, no es lo que está pensando (por ejemplo, matrices de tipos genéricos)
- 22. ¿Qué es el tiempo de ejecución moderno?
- 23. ¿Por qué C no admite tipos genéricos implícitos en los constructores de clases?
- 24. colección de tipos genéricos
- 25. GetType en tipos genéricos
- 26. Marshalling .NET tipos genéricos
- 27. tipos primas y Genéricos - Java
- 28. ¿Cuándo genéricos de Java utilizan el casting en tiempo de ejecución?
- 29. Filtrando listas de tipos genéricos
- 30. EventArgs genéricos para los tipos incorporados
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. –
whoops, typo. Fijo. – thecoop