variable tipo practices net inicializar guidelines datatype convenciones coding codigo code best c# declaration implicit-typing variable-declaration

tipo - ¿Por qué C#no te permite declarar múltiples variables usando var?



inicializar variable tipo var c# (5)

Dado lo siguiente:

// not a problem int i = 2, j = 3;

entonces me sorprende que esto:

// compiler error: Implicitly-typed local variables cannot have multiple declarators var i = 2, j = 3;

no compila Tal vez hay algo que no entiendo acerca de esto (¿por qué estoy preguntando esto?

Pero ¿por qué el compilador no se daría cuenta de que quería decir:

var i = 2; var j = 3;

que compilaría


Creo que es demasiado dudoso. Cuando las dos variables son del mismo tipo, es un caso específico fácil, pero en el caso más general, debería considerar lo que es "correcto" en un código como:

var x = new object(), y = "Hello!", z = 5;

¿Deberían todos escribirse como object , ya que ese es el único tipo que todos tienen en común? ¿O debería ser x object , y ser string , y z ser int ?

Por un lado, puede pensar en el primero, ya que las variables declaradas de esta manera (todas en una línea) generalmente se presume que todas son del mismo tipo. Por otro lado, quizás pienses que es el último, ya que se supone que la palabra clave var generalmente hace que el compilador infiera el tipo más específico para ti.

Es mejor prohibir esto por completo que molestarse en averiguar exactamente cómo debería comportarse, dado que de todos modos no sería exactamente una característica "asesina".

Esa es mi opinión / supongo, al menos.


Creo que es porque para el compilador podría ser lo mismo que:

var i = 2, j = "three"

Y esos seguramente no son del mismo tipo.


Cuando diseñamos la función, le pregunté a la comunidad qué

var x = 1, y = 1.2;

debería significar. La pregunta y las respuestas están aquí:

http://blogs.msdn.com/b/ericlippert/archive/2006/06/26/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2006/06/27/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-two.aspx

Brevemente, alrededor de la mitad de los encuestados dijo que lo obviamente correcto era hacer que xey ambos se duplicaran, y aproximadamente la mitad de los encuestados dijo que la cosa obviamente correcta era hacer que x int y y se duplicaran.

(El comité de lenguaje especificó que debería ser "doble", y de hecho implementé el código mucho antes de enviar. Utilizamos el mismo algoritmo de inferencia de tipo que para las matrices implícitamente tipadas, donde todas las expresiones deben ser convertibles a el mejor tipo de elemento).

Cuando la mitad de su base de clientes piensa que una cosa es "obviamente correcta" y la otra mitad cree que lo opuesto es "obviamente correcto", entonces tiene un gran problema de diseño en sus manos. La solución fue hacer que todo fuera ilegal y evitar el problema.


Es solo otro punto de posible confusión para el programador y el compilador.

Por ejemplo, esto está bien:

double i = 2, j = 3.4;

¿Pero qué significa esto?

var i = 2, j = 3.4;

Con el azúcar sintáctico, este tipo de cosas es un dolor de cabeza que nadie necesita, así que dudo que tu caso pueda ser respaldado. Implica demasiado del compilador que intenta ser un poco demasiado inteligente.


Porque si esto funcionó:

var i = 2, j = 3;

porque esto funciona:

var i = 2; var j = 3;

entonces puedes esperar que esto funcione:

var i = 2, j = "3";

porque esto funciona:

var i = 2; var j = "3";

Incluso en el caso planteado por James Gaunt, donde ambos son tipos numéricos y podrían almacenarse en un valor del mismo tipo, ¿qué tipo sería ?:

var i = 2, j = 3.4;

j es obviamente un doble, pero lógicamente podría ser un int o un doble, dependiendo de cómo esperas var para inferir los tipos. De cualquier forma que se implemente, causaría confusión con las personas que esperaban que funcionara de otra manera.

Para evitar toda esta confusión, simplemente no se permite. Personalmente, no lo veo como una gran pérdida, personalmente; si desea declarar una lista de variables (que en sí misma es bastante rara en mi experiencia laboral), solo escriba fuertemente em.