Во многих списках MSIL я заметил следующее:
System.Nullable`1<!0> etc ...
или
class !0 etc ...
Какое значение !0
в этих обстоятельствах?
Во многих списках MSIL я заметил следующее:
System.Nullable`1<!0> etc ...
или
class !0 etc ...
Какое значение !0
в этих обстоятельствах?
Это quirk декомпилятора, который вы используете для просмотра сборки .NET. Это поведение ildasm.exe, другие, такие как Reflector или ILSpy, получают это право. Разработчик Microsoft, который написал его, получил ярлык, он генерирует строку из IL, которая просто отображает аргумент типа так, как он закодирован, без написания дополнительного кода для поиска имени аргумента типа в метаданных.
Вам нужно прочитать !n
как аргумент n-го типа общего типа. Где! 0 означает "аргумент первого типа",! 1 означает "аргумент второго типа" и т.д. Для Nullable < > вы знаете, что '! 0` означает "T" из статьи MSDN.
Вы также можете встретить что-то вроде !!T
. Две восклицательные знаки указывают аргумент типа для общего метода. На этот раз ildasm.exe ищет имя аргумента типа вместо использования !!0
. Почему программист взял ярлык на общих типах, но не на общие методы трудно перепроектировать. Ildasm - довольно причудливая программа и написан в стиле С++, который очень отличается от другого кода на С++ в .NET. Не как дисциплинированные, отличные от нуля шансы на то, что это было задание на стажировку:)
Суффикс `1 на "Nullable" является обычной кодировкой для имен универсального типа, он указывает, что общий тип имеет один аргумент типа. Другими словами, для Nullable < > вы никогда не увидите! 1. Используется.
Так просто прочитайте !0
как "T". Или используйте лучший декомпилятор.
Это общий параметр типа.
Они позиционные.
Декомпилируйте некоторый общий код, чтобы узнать, как они используются (сравните IL vs С#).