То, почему делает время выполнения, показывает универсальные типы как “GenericType'n”?

С переменной, введенной id, можно отправить его, любое известное сообщение и компилятор не будут жаловаться. С переменной, введенной NSObject *, можно только отправить, она обменивается сообщениями объявленный NSObject (не методы любого подкласса), или иначе она генерирует предупреждение. В целом, id то, что Вы хотите.

Дальнейшее объяснение: Все объекты имеют по существу тип id. Точка объявления статического типа должна сказать компилятор, "Предположите, что этот объект является членом этого класса". Таким образом, если Вы отправляете ему сообщение, что класс не объявляет, компилятор может сказать Вам, "Ожидайте, что объект, как предполагается, не получает то сообщение!" Кроме того, если два класса имеют методы с тем же именем, но различные подписи (то есть, аргумент или типы возврата), оно может предположить, какой метод Вы подразумеваете под классом, который Вы объявили для переменной. Если это будет объявлено как id, компилятор просто подбросит свои руки и скажет Вам, "хорошо, у меня нет достаточной информации здесь. Я выбираю сигнатуру метода наугад". (Этому обычно не будут помогать путем объявления NSObject*, все же. Обычно конфликт между двумя более определенными классами.)

5
задан remio 26 September 2009 в 20:52
поделиться

3 ответа

`1 - это синтаксис MSIL для универсального типа - List специфичен для C #. Дополнительные примеры 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]
3
ответ дан 18 December 2019 в 10:46
поделиться

Он не показывает List , потому что этот синтаксис зависит от C #. Список в исходном коде .Net может быть объявлен как List , List (Of String) или любой из 60 или около того языков / синтаксисов, которые можно компилировать до MSIL. .

Итак, вы видите более общий синтаксис MSIL.

«1» означает, что это список с одним универсальным параметром.

4
ответ дан 18 December 2019 в 10:46
поделиться

Имя CLR для универсального List с одним параметром типа -

System.Collections.Generic.List`1

List - стиль именования этого типа в C #.

Нотация - это соглашение, определенное для того, чтобы дать вам возможность перегрузить универсальные типы по количеству параметров. Если вы объявляете класс с именем List с двумя параметрами типа (например, List ) компилятор сможет выбрать правильный. Он будет называться:

System.Collections.Generic.List`2

, а неуниверсальный класс List будет назван:

System.Collections.Generic.List

Обратите внимание, что CLR не требует, чтобы общие типы назывались подобным образом. Это просто соглашение, по которому компиляторы могут выбрать правильный тип.

9
ответ дан 18 December 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: