c# - que - ¿Por qué! 0 es un tipo de lenguaje intermedio de Microsoft(MSIL)?
que es msil microsoft intermediate language (2)
Ese es un parámetro de tipo genérico.
Son posicionales.
Descompile algún código genérico para ver cómo se usan (compare IL frente a C #).
En muchos listados de MSIL, he observado lo siguiente:
System.Nullable`1<!0> etc ...
o
class !0 etc ...
¿Cuál es el significado de
!0
en estas circunstancias?
Esta es la peculiaridad del descompilador que usa para mirar un ensamblado .NET. Es el comportamiento de ildasm.exe, otros como Reflector o ILSpy lo hacen bien. El programador de Microsoft que lo escribió tomó un atajo, genera una cadena desde el IL que simplemente muestra el argumento de tipo de la forma en que está codificado, sin escribir el código adicional para buscar el nombre del argumento de tipo en los metadatos.
Debe leer
!n
como el enésimo argumento de tipo del tipo genérico.
Donde! 0 significa "primer argumento de tipo",! 1 significa "segundo argumento de tipo", etcétera.
Para Nullable <>, sabe que ''! 0` significa'' T ''del artículo de MSDN.
También puede encontrar algo como
!!T
Dos signos de exclamación indican un argumento de tipo para un
método
genérico.
Esta vez, ildasm.exe busca el nombre del argumento de tipo en lugar de usar
!!0
.
Por qué el programador tomó el atajo en tipos genéricos pero no en métodos genéricos es difícil de aplicar ingeniería inversa.
Ildasm es un programa bastante peculiar y está escrito en un estilo de codificación C ++ que es muy diferente de otro código C ++ en .NET.
No es tan disciplinado, no hay cero probabilidades de que esta sea una tarea de pasante :)
El sufijo `1 en" Nullable "es una codificación normal para nombres de tipo genérico, indica que el tipo genérico tiene un argumento de tipo. En otras palabras, para Nullable <> nunca verás! 1 siendo usado.
Así que simplemente lee
!0
como "T".
O usa un mejor descompilador.