web-dev-qa-db-fra.com

Pourquoi! 0 est-il un type dans Microsoft Intermediate Language (MSIL)?

Dans de nombreuses listes MSIL, j'ai observé ce qui suit:

System.Nullable`1<!0> etc ...

ou

class !0 etc ...

Que veut dire !0 dans ces circonstances?

86
Dragno

Il s'agit de la particularité du décompilateur que vous utilisez pour examiner un assemblage .NET. C'est le comportement d'ildasm.exe, d'autres comme Reflector ou ILSpy le font bien. Le programmeur Microsoft qui l'a écrit a pris un raccourci, il génère une chaîne à partir de l'IL qui affiche simplement l'argument type comme il est encodé, sans écrire le code extra pour rechercher le nom de l'argument type dans les métadonnées .

Vous devez lire !n comme argument de nième type du type générique. Où! 0 signifie "argument de premier type",! 1 signifie "argument de second type", etc. Pour Nullable <>, vous savez que "! 0" signifie "T" dans l'article MSDN.

Vous pouvez également rencontrer quelque chose comme !!T. Deux points d'exclamation indiquent un argument de type pour un générique méthode. Cette fois, ildasm.exe fait recherche le nom de l'argument de type au lieu d'utiliser !!0. Pourquoi le programmeur a pris le raccourci sur les types génériques mais pas sur les méthodes génériques est difficile à inverser. Ildasm est un programme assez original et est écrit dans un style de codage C++ qui est très différent des autres codes C++ dans .NET. Pas aussi discipliné, non nul que ce soit une mission de stagiaire :)

Le suffixe `1 sur" Nullable "est un encodage normal pour les noms de type génériques, il indique que le type générique a un argument de type. En d'autres termes, pour Nullable <>, vous ne verrez jamais! 1 utilisé.

Alors lisez simplement !0 comme "T". Ou utilisez un meilleur décompilateur.

114
Hans Passant

Il s'agit d'un paramètre de type générique.

Ils sont positionnels.

Décompiler du code générique pour voir comment ils sont utilisés (comparer IL vs C #).

35
leppie