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

Что такое 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?

4b9b3361

Ответ 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( .....

вместо того, чтобы размещать защитные оговорки повсюду