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?))
né
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 nomiSystem.Reflection
, ma raramente è utile in un’applicazione tipica. La strutturaVoid
non ha membri diversi da quelli che tutti i tipi ereditano dalla classObject
.
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