Domanda

Qualcuno sa o si preoccupa di speculare sul perché la tipizzazione implicita è limitata alle variabili locali?

var thingy = new Foo();

Ma perché no ...

var getFoo() {
    return new Foo(); 
}
È stato utile?

Soluzione

Eric Lippert ha pubblicato un intero blog sull'argomento.

In sintesi, il problema principale è che avrebbe richiesto una grande architettura del compilatore C # per farlo. Le dichiarazioni sono attualmente elaborate in un unico passaggio. Ciò richiederebbe più passaggi a causa della capacità di formare cicli tra variabili dedotte. VB.net ha all'incirca lo stesso problema.

Altri suggerimenti

Jared ha un link fantastico nella sua risposta, a un argomento fantastico.

Penso che non risponda esplicitamente alla domanda.

Perché no?

var getFoo() {
    return new Foo(); 
}

Il motivo è:

Cosa succede se?

class Foo {}

var GetFoo() {
   return GetBar(); 
}

var GetBar() {
  return GetBaz(); 
}

var GetBaz() {
   return new Foo();
}

Potresti dedurre che GetFoo restituirà Foo , ma dovrai rintracciare tutto le chiamate che il metodo effettua e le sue figli fa solo dedurre il tipo. Allo stato attuale, il compilatore C # non è progettato per funzionare in questo modo. Ha bisogno di metodi e tipi di campo nelle prime fasi del processo prima che il codice che li infetta possa essere eseguito.

A livello puramente estetico, trovo che le definizioni var sui metodi confondano le cose. Il suo unico posto in cui penso che essere esplicito sempre ti aiuti, ti protegge da spararti nel piede restituendo accidentalmente un tipo che provoca la modifica della tua firma e di tonnellate di altre firme di metodi dipendenti. Peggio ancora, potresti potenzialmente cambiare tutte le tue firme di una catena di metodi senza nemmeno sapere di averlo fatto se restituissi il valore di un metodo che restituisce oggetto e si è rivelato fortunato.

Penso che i metodi var siano preferibili per linguaggi dinamici come Ruby

Perché è molto più facile da fare. Se dovessi dedurre tutti i tipi, avresti bisogno di qualcosa come il sistema di inferenza di tipo Hindley Milner che trasformerà il tuo amato C # in linguaggio derivato di Haskel.

In sostanza, il problema che stai riscontrando è che C # (finora) è un linguaggio tipicamente statico. Una variabile locale definita come var è ancora tipizzata staticamente, ma sintatticamente nascosta. Un metodo che restituisce var, d'altra parte, ha molte implicazioni. Diventa più di un'interfaccia per l'uso e non ottieni nulla usando var.

puoi usare in vs 2010 Dinamico

Dynamic getFoo() { 
    return new Foo();  
} 

Penso che sia perché l'ambito di quel tipo implicito è molto più ampio e quindi ha maggiori probabilità di causare problemi rispetto all'ambito di un singolo metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top