Почему же!0 тип в Microsoft Intermediate Language (MSIL)?


во многих списках MSIL я заметил следующее:

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

или

class !0 etc ...

что значит !0 в этих обстоятельствах?

2 85

2 ответа:

это причуда декомпилятора, который вы используете для просмотра сборки .NET. Это поведение ildasm.exe, другие, такие как Reflector или ILSpy, получают это право. Программист Microsoft, который написал его, взял ярлык, он генерирует строку из IL, которая просто отображает аргумент типа так, как он закодирован, без записи дополнительно код для поиска имени аргумента типа в метаданных.

вы должны прочитать !n в качестве аргумента n-го типа универсального тип. Куда ?0 означает "аргумент первого типа",!1 означает "аргумент второго типа" и т. д. Для Nullable, вы знаете, что '!0 'означает' T ' из статьи MSDN.

вы также можете столкнуться с чем-то вроде !!T. Два восклицательных знака указывают на аргумент типа для универсального метод. На этот раз, ildasm.exe тут найдите имя аргумента типа вместо использования !!0. Почему программист взял ярлык на универсальные типы, но не на универсальные методы трудно реконструировать. Ildasm-довольно причудливая программа и написана в стиле кодирования C++, который очень отличается от другого кода C++ в .NET. Not как дисциплинированный, ненулевые шансы, что это было назначение стажера :)

суффикс `1 на "Nullable" является нормальной кодировкой для имен универсальных типов, он указывает, что универсальный тип имеет один аргумент типа. Другими словами, для Nullable вы никогда не увидите !1 используется.

так просто читать !0 как "Т". Или использовать лучше декомпилятор.

Это параметр универсального типа.

Они позиционные.

Декомпилируйте некоторый общий код, чтобы увидеть, как они используются (сравните IL против C#).