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

Почему не System.Void?

Возможный дубликат:
Что такое System.Void?

У меня нет практической причины знать этот ответ, но мне все равно любопытно...

В С# попытка использования System.Void приведет к ошибке компиляции:

ошибка CS0673: System.Void не может использоваться из С# - используйте typeof (void), чтобы получить объект типа void

Как я понял, void является просто псевдонимом System.Void. Поэтому я не понимаю, почему "System.Void" не может использоваться напрямую, как вы могли бы, например, с помощью "string" для "System.String". Я хотел бы прочитать объяснение для этого!

Кстати, System.Void может быть успешно использован с компилятором Mono, а не с Microsoft, и там он выглядит эквивалентно использованию ключевого слова void. Следовательно, это должно быть ограничение, связанное с компилятором, а не ограничение CLR, правильно?

4b9b3361

Ответ 1

Я считаю, что единственная цель этой структуры - использовать ее при отражении, тогда как другие типы (например, System.String, System.Int32 и т.д.) являются правильными типами, хранящими данные. Void не содержит данных, и вы не можете создать эту структуру из своего кода.

Мое предположение о ошибке компилятора заключается в том, что он должен обеспечить согласованность кода. Было бы странно иметь такие методы:

System.Void MyMethod() { ... }

На первый взгляд кажется, что он что-то возвращает, а на самом деле это не так. На мой взгляд, это хорошее решение команды С# (если мои рассуждения о ней верны)

Ответ 2

Возможно, потому, что если System.Void был разрешен как ссылка на тип, он мог бы появиться в

  • объявления функций (тип возврата) - это, очевидно, законно
  • объявления параметров
  • объявления аргументов шаблона
  • объявления переменных

Использование typeof(void) делает это синтаксически незаконным. Это следует принципу наименьшего удивления.

Изменить Также, как указывает Эрик Липперт, это происходит потому, что, например, Пустота не является суперклассом всего (пустота, по сути, инвариантна). Подробнее читайте здесь http://blogs.msdn.com/b/ericlippert/archive/2009/06/29/the-void-is-invariant.aspx