Подтвердить что ты не робот

Каково было обоснование дизайна для того, чтобы сделать пустоту не примитивным типом?

При использовании отражения Type.IsPrimitive в void тип возвращает false. Копирование с фона на С++ было неожиданным.

Глядя на С# 6.0 spec (Страница 82) не упоминает тип void, что может означать, что он не классифицирован как тип вообще.

Есть ли что-либо в спецификации языка или иначе, что классифицирует void как что-то еще. Или любое другое обсуждение или такое, которое упоминает причину этого?

4b9b3361

Ответ 1

Почему не является пустым примитивный тип? Потому что это не то, что вы можете создать. Это не примитивный тип, не ссылочный тип. Это ничего не значит.

Эрик Липперт описывает некоторые "проблемы" с типом void в этой записи в Software Engineering, которая затрагивает специфику void как тип, который следует использовать в делегаты и Action s:

Система типов - это, по сути, система для логических выводов о том, какие операции действительны для конкретных значений; метод возврата void не возвращает значение, поэтому вопрос "какие операции действительны для этой вещи?" не имеет никакого смысла. Там нет "вещи" для операции, действительной или недействительной.

Приводя его примитивным типом, он поражает особый смысл и назначение void в VES (Virtual Execution System), как объясняет позже Эрик:

Эффект вызова метода void принципиально отличается от эффекта вызова непустого метода; метод non-void всегда помещает что-то в стек, который, возможно, нужно будет удалить. Метод void никогда не помещает что-то в стек.

Создание void примитивного типа нарушает это правило, хотя вы можете утверждать его полезность, как объясняет далее Эрик в ссылке, на которую ссылаются.

Ответ 2

void не является типом, это ключевое слово. Точно так же, как в С++, это то же самое. Ключевые слова играют возвышенную роль в языке, они могут появляться только в определенных местах, и парсеру разрешено делать серьезные предположения о намерении программиста.

В первую очередь роль заключается в создании хороших сообщений об ошибках. Очевидно, что в заявлении типа return 42; в объявленном методе вы получите сообщение об ошибке "эй, вы сказали, что ничего не вернете". Менее очевидно, что они очень полезны для восстановления от основных синтаксических ошибок, например, отсутствующая скобка закрытия } - это довольно сложная ошибка для восстановления. Когда синтаксический анализатор встречает void при разборе тела метода, он может reset состояние парсера и снова запускать хорошие сообщения об ошибках.

То, что тип System.Void вообще существует, - это причуда, связанная с метаданными. Грубый эквивалент файла .h в С++. Они существуют в основном, чтобы иметь дело с техническими ограничениями на С++, он не имеет понятия модулей, он использует однопроходную модель компиляции и требует, чтобы декларации всегда отображались перед определениями. Довольно болезненная занятость на С++, хотя инструмент редактора может немного помочь. В С# таких ограничений нет, компилятор генерирует декларацию из определения.

Метаданные подробно описывают метод, хранящийся в записях MethodDef и MethodDefSig в метаданных. Два основных способа, с помощью которых разработчики CLR могли бы выразить понятие "этот метод не возвращает данные". Очевидным способом является то, что они могли бы немного использовать в перечисление MethodAttributes, что-то вроде "HasNoReturnValue". Но так как многие методы имеют невоидный возвращаемый тип, а пространство для него зарезервировано в записи MethodDefSig, они просто выбрали значение счетчика в качестве возвращаемого типа. System.Void.

Отражение на типе System.Void обычно не полезно. Реально они могли бы выбрать любую ценность для IsPrimitive, и это не имело бы никакого значения. False был логичным выбором, он не описывает тип.

Ответ 3

Из чтения спецификации С# нет упоминания о типе void. Он написан как return type. В оглавлении он не относится к категории ссылок или значений. Он упоминается как ключевое слово.

В разделе функции typeof говорится:

Третий вид typeof-expression состоит из ключевого слова typeof, за которым следует ключевое слово void в скобках. Результатом выражения этой формы является объект System.Type, который представляет отсутствие типа. Объект типа, возвращаемый typeof (void), отличается от объекта типа, возвращаемого для любого типа. Этот объект специального типа полезен в библиотеках классов, которые позволяют отражать методы на языке, где эти методы хотят иметь способ представления возвращаемого типа любого метода, включая методы void, с экземпляром System.Type.

Что мне указывает, что void имеет связанный тип, но используется только в том случае, если вы хотите, чтобы отражение давало вам что-то ощутимое из-за системы типов. В противном случае void - это просто ключевое слово.