Jared tiene un enlace fantástico en su respuesta, a un tema fantástico.
Creo que no responde la pregunta de forma explícita.
¿Por qué no?
var getFoo() {
return new Foo();
}
La razón de esto es:
¿Qué pasa si?
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
Se podría deducir que GetFoo
va a volver Foo
, pero tendrá que rastrear a través todas las llamadas que método hace que los niños y sus hace sólo para inferir el tipo. Tal como está, el compilador de C# no está diseñado para funcionar de esta manera. Necesita métodos y tipos de campo al principio del proceso antes de que se pueda ejecutar el código que infiere los tipos.
En un nivel puramente estético que encontrar las definiciones var sobre los métodos de confundir las cosas. Su único lugar donde creo que ser explícita siempre ayuda, que le protege de disparar a su auto en el pie accidentalmente devolver un tipo que causa su firma y un montón de otras firmas de método depende de cambiar. Lo peor es que podrías cambiar todas las firmas de una cadena de métodos sin siquiera saber que lo hiciste si devuelves el valor de un método que devuelve un objeto y resulta afortunado.
Creo métodos var es mejor dejar para lenguajes dinámicos como Ruby
divertido, se propone la adición de otra de las características de la lengua sólo para compensar una deficiencia del compilador Hay formas de escribir un compilador que no permita el escape de tipos anónimos, o que pueda manejar un enfoque de primer paso diferido. –
Soy consciente de que hay formas de hacerlo. Estamos eligiendo no hacer ninguno de ellos en este momento; sus costos no valen los beneficios. –
lo siento Eric, supongo que todo lo que estoy tratando de decir es que estoy feliz de esperar al refactor de compiladores en lugar de votar por copiar el nuevo() de java, incluso si podemos tenerlo antes. Simplemente no parece que encaje bien ya que ya tenemos var. –