Che cos’è System.Void?

So che i metodi dichiarati con il void non restituiscono nulla.

Ma sembra che in C # void sia più di una semplice parola chiave, ma di un tipo reale.
void è un alias per System.Void come int che è per System.Int32 .

Perché non mi è permesso usare quel tipo? Non ha alcun senso, ma questo è solo un pensiero sulla logica.

Nessuno dei due

 var nothing = new System.Void(); 

(che dice che dovrei usare void (non un alias?))

 var nothing = new void(); 

compila.

Inoltre, non è ansible usare qualcosa del genere:

 void GiveMeNothing() { } void GiveMeNothingAgain() { return GiveMeNothing(); } 

Quindi, qual è il problema con System.Void ?

Dalla documentazione :

La struttura Void viene utilizzata nello spazio dei nomi System.Reflection , ma raramente è utile in un’applicazione tipica. La struttura Void non ha membri diversi da quelli che tutti i tipi ereditano dalla class Object .

Non c’è ragione di usarlo nel codice.

Anche:

 var nothing = new void(); 

Questo non mi viene compilato. Cosa intendi quando lo dici “funziona”?

Aggiornare:

Un metodo void Foo() non restituisce nulla. System.Void è lì in modo che se si chiede (tramite Reflection) “qual è il tipo del valore restituito quel metodo?”, È ansible ottenere il tipo di risposta typeof(System.Void) . Non vi è alcun motivo tecnico per cui non sia ansible restituire null , ma ciò introdurrebbe un caso speciale nell’API di Reflection e, se ansible, i casi speciali devono essere evitati.

Infine, non è legale che un programma contenga il tipo expressionof typeof(System.Void) . Tuttavia, questa è una restrizione imposta dal compilatore , non una CLR. Infatti, se si prova il tipo di funzione consentita typeof(void) e si guarda il suo valore nel debugger, si vedrà che è lo stesso valore che sarebbe se typeof(System.Void) fosse legale.

void / System.Void è diverso da int / System.Int32 , è una struttura speciale in C #, usata solo per la reflection. Vedi questo esempio:

 class Program { public static void Main(string[] args) { Type voidType = typeof(Program).GetMethod("Main").ReturnType; } } 

Ci deve essere un tipo usato per descrivere il tipo di ritorno del metodo Main qui, ecco perché abbiamo System.Void .

Oltre a non restituire un valore, viene data una definizione molto piccola di void (anche se il void* ottiene una certa attenzione) nelle specifiche del linguaggio. Questo non è davvero un problema linguistico – sebbene la CLI possa definirlo ulteriormente.

In definitiva però: perché non ha senso fare new void()

Abbiamo usato il seguente codice

 public Type GetType(object o) { var type = o == null ? typeof(void) : o.GetType(); } 

In modo che possiamo usare il modello di object nullo. È abbastanza buono. Questo ci permette di fare cose del genere

 GetType(o).GetProperties().Select( ..... 

invece di mettere le clausole di guardia ovunque