Что такое System.Void?
Я знаю, что методы, объявленные с помощью void
, ничего не возвращают.
Но кажется, что в С# void
больше, чем просто ключевое слово, но реальный тип.
void
является псевдонимом для System.Void
, как int
, который для System.Int32
.
Почему мне не разрешено использовать этот тип? Это не имеет никакого смысла, но это всего лишь некоторые мысли о логике.
Ни
var nothing = new System.Void();
(который говорит, что я должен использовать void
(не псевдоним?))
ни
var nothing = new void();
компилирует.
Также невозможно использовать что-то вроде этого:
void GiveMeNothing() { }
void GiveMeNothingAgain()
{
return GiveMeNothing();
}
Итак, какова точка с System.Void
?
Ответы
Ответ 1
Из документации:
Структура Void
используется в System.Reflection
, но это редко полезно в типичном выражение. Структура Void
не имеет члены, отличные от всех типов наследовать от класса Object
.
Нет смысла использовать его в коде.
также:
var nothing = new void();
Это не компилируется для меня. Что вы имеете в виду, говоря "работает"?
Update:
Метод void Foo()
ничего не возвращает. System.Void
существует так, что если вы спросите (через Reflection) "какой тип возвращаемого значения этот метод?", вы можете получить ответ typeof(System.Void)
. Нет технической причины, по которой он не мог бы возвращать null
вместо этого, но это ввело бы частный случай в Reflection API, и по возможности следует избегать особых случаев.
Наконец, для программы не обязательно содержать выражение typeof(System.Void)
. Однако это ограничение, связанное с компилятором, а не CLR. Действительно, если вы попробуете разрешенный typeof(void)
и посмотрите на его значение в отладчике, вы увидите, что это то же самое значение, если бы typeof(System.Void)
были законными.
Ответ 2
void
/System.Void
отличается от int
/System.Int32
, это специальная структура в С#, используемая только для отражения. См. Этот пример:
class Program
{
public static void Main(string[] args)
{
Type voidType = typeof(Program).GetMethod("Main").ReturnType;
}
}
Для описания возвращаемого типа метода Main
должен использоваться некоторый тип, поэтому у нас есть System.Void
.
Ответ 3
Помимо того, что не возвращается значение, дается очень мало определения void
(хотя void*
получает некоторое внимание) в спецификации языка. Это не проблема языка, хотя CLI может определить ее далее.
В конечном счете, хотя: потому что не имеет смысла делать new void()
Ответ 4
Мы использовали следующий код
public Type GetType(object o)
{
var type = o == null ? typeof(void) : o.GetType();
}
Итак, мы можем использовать шаблон нулевого объекта. Это довольно хорошо.
Это позволяет нам делать такие вещи, как
GetType(o).GetProperties().Select( .....
вместо того, чтобы размещать защитные оговорки повсюду