Jared ha una fantastica link nella sua risposta, ad un argomento fantastico.
penso che non risponde alla domanda in modo esplicito.
Perché no?
var getFoo() {
return new Foo();
}
La ragione di questo è:
What if?
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
Si potrebbe dedurre che GetFoo
sta per tornare Foo
, ma si dovrà tracciare attraverso tutti le chiamate che il metodo fa e le sue bambini fa solo per dedurre il tipo. Così com'è, il compilatore C# non è progettato per funzionare in questo modo. Ha bisogno di metodi e tipi di campo nelle prime fasi del processo prima del codice che può essere utilizzato dai tipi.
Su un piano puramente estetico trovo le definizioni var sui metodi di confondere le cose. Il suo unico posto dove penso che sia esplicito sempre aiuta, ti protegge dal spararti nel piede restituendo per sbaglio un tipo che causa la tua firma e una tonnellata di altre firme del metodo dipendente da modificare. Peggio ancora, potresti potenzialmente cambiare tutte le firme di una catena di metodi senza nemmeno sapere che lo hai fatto se restituisci il valore di un metodo che restituisce un oggetto e che è stato fortunato.
Penso metodi var è meglio lasciarle per linguaggi dinamici come Ruby
fonte
2009-05-05 14:30:35
divertente, egli propone di aggiungere un altro elemento alla lingua solo per compensare un deficit del compilatore. Esistono modi per scrivere un compilatore che non consente la fuoriuscita di tipi anonimi o che può gestire un approccio di primo passaggio posticipato. –
Sono consapevole che ci sono modi per farlo. Stiamo scegliendo di non fare nessuno di questi in questo momento; i loro costi non valgono i benefici. –
scusa Eric, immagino che tutto quello che sto cercando di dire è che sono felice di aspettare il refattore del compilatore invece di votare per copiare java's new(), anche se possiamo farlo prima. Semplicemente non mi sembra adatto perché abbiamo già var. –