46 votes

Pourquoi C# ne vous permet-il pas de déclarer plusieurs variables en utilisant var ?

Étant donné ce qui suit:

// pas de problème
int i = 2, j = 3;

cela me surprend donc que ceci:

// erreur de compilateur: les variables locales de type implicite ne peuvent pas avoir plusieurs déclarateurs
var i = 2, j = 3;

ne compile pas. Peut-être y a-t-il quelque chose que je ne comprends pas à ce sujet (c'est pourquoi je pose cette question)?

Mais pourquoi le compilateur ne réaliserait-il pas que je voulais dire:

var i = 2;
var j = 3;

ce qui COMPILERAIT.

60voto

Eric Lippert Points 300275

Lorsque nous avons conçu la fonctionnalité, j'ai demandé à la communauté ce que

var x = 1, y = 1.2;

devrait signifier. La question et les réponses se trouvent ici:

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

En bref, environ la moitié des répondants ont dit que la chose évidemment correcte à faire était de rendre x et y tous les deux double, et environ la moitié des répondants ont dit que la chose évidemment correcte à faire était de rendre x int et y double.

(Le comité linguistique a spécifié que cela devait être "double", et j'ai effectivement implémenté le code de cette manière bien avant la mise en production. Nous avons utilisé le même algorithme d'inférence de type que pour les tableaux à typage implicite, où toutes les expressions doivent être convertibles en un meilleur type d'élément.)

Lorsque la moitié de votre base de clients pense qu'une chose est "évidemment correcte" et que l'autre moitié croit que l'opposé est "évidemment correct", vous avez un gros problème de conception entre les mains. La solution a été de rendre toute la chose illégale et d'éviter le problème.

41voto

James Gaunt Points 9541

C'est juste un autre point de confusion possible pour le programmeur et le compilateur.

Par exemple, c'est bien:

double i = 2, j = 3.4;

mais que signifie ceci?

var i = 2, j = 3.4;

Avec du sucre syntaxique, ce genre de chose est un mal de tête dont personne n'a besoin - donc je doute que votre cas serait jamais supporté. Cela implique que le compilateur essaie d'être un peu trop malin.

6voto

KeithS Points 36130

Parce que si cela fonctionnait:

var i = 2, j = 3;

parce que cela fonctionne:

var i = 2;
var j = 3;

alors vous pourriez vous attendre à ce que cela fonctionne:

var i = 2, j = "3";

parce que cela fonctionne:

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

Même dans le cas posé par James Gaunt, où ils sont tous deux de types numériques et pourraient être stockés dans une valeur du même type, quel type serait i ?:

var i = 2, j = 3.4;

j est évidemment un double, mais i pourrait logiquement être soit un entier, soit un double, en fonction de la manière dont vous vous attendiez à ce que var infère les types. De toute façon, si cela était implémenté, vous causeriez de la confusion avec les personnes qui s'attendaient à ce que cela fonctionne de l'autre manière.

Pour éviter toute cette confusion, cela est simplement interdit. Personnellement, je ne vois pas cela comme une grande perte; si vous voulez déclarer une liste de variables (ce qui est assez rare dans mon expérience professionnelle), il suffit de les typer fortement.

4voto

Dan Tao Points 60518

Je pense que c'est juste trop incertain. Lorsque les deux variables sont du même type, c'est un cas spécifique facile, mais dans le cas plus général, vous devez considérer ce qui est "correct" dans du code comme :

var x = new objet(), y = "Bonjour!", z = 5;

Toutes devraient-elles être typées comme objet, puisque c'est le seul type qu'elles ont en commun ? Ou bien x devrait être objet, y devrait être string, et z devrait être int ?

D'un côté, vous pourriez penser à la première option, puisque les variables déclarées de cette manière (toutes sur une même ligne) sont généralement supposées être du même type. D'un autre côté, peut-être que vous penseriez à la deuxième option, puisque le mot-clé var est censé permettre au compilateur d'inférer le type le plus spécifique pour vous.

Mieux vaut tout simplement interdire cela plutôt que de se préoccuper de savoir exactement comment cela devrait se comporter, étant donné que ce ne serait pas vraiment une fonctionnalité "essentielle" de toute façon.

C'est du moins mon avis/supposition.

1voto

Ilya Dvorovoy Points 199

Je pense que c'est parce que pour le compilateur, cela pourrait être la même chose que:

var i = 2, j = "three"

Et ceux-ci ne sont sûrement pas du même type.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X