Почему C # не позволяет вам объявлять несколько переменных, используя var? - PullRequest
45 голосов
/ 09 февраля 2011

Учитывая следующее:

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

так что меня удивляет, что это:

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

не компилируется. Может быть, я чего-то не понимаю (вот почему я спрашиваю об этом)?

Но почему бы компилятору не понять, что я имел в виду:

var i = 2;
var j = 3;

который будет компилироваться.

Ответы [ 5 ]

59 голосов
/ 10 февраля 2011

Когда мы разработали эту функцию, я спросил сообщество, что

var x = 1, y = 1.2;

должно означать. Вопрос и ответы здесь:

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

Вкратце, около половины респондентов сказали, что очевидно правильное, что нужно сделать, чтобы x и y оба удвоились, и около половины респондентов сказали, что очевидно правильное, что нужно сделать, чтобы x int и y удвоились.

(Комитет по языку указал, что он должен быть «двойным», и я фактически реализовал код задолго до того, как мы его отправили. Мы использовали тот же алгоритм вывода типов, что и для неявно типизированных массивов, где все выражения должны быть конвертируется в лучший тип элемента.)

Когда половина вашей клиентской базы думает, что одна вещь «очевидно правильна», а другая половина считает, что противоположность «очевидно правильна», тогда у вас большие проблемы с дизайном. Решение состояло в том, чтобы сделать все это незаконным и избежать проблемы.

38 голосов
/ 09 февраля 2011

Это просто еще одна точка возможной путаницы для программиста и компилятора.

Например, это нормально:

double i = 2, j = 3.4;

но что это значит?

var i = 2, j = 3.4;

С синтаксическим сахаром подобные вещи - головная боль, которая никому не нужна, поэтому я сомневаюсь, что ваш случай когда-либо будет поддержан.Это требует от компилятора слишком больших усилий, чтобы быть слишком умным.

6 голосов
/ 09 февраля 2011

Потому что, если это сработало:

var i = 2, j = 3;

потому что это работает:

var i = 2;
var j = 3;

тогда вы можете ожидать, что это сработает:

var i = 2, j = "3";

потому что это работает:

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

Даже в случае, заданном Джеймсом Гонтом, когда они оба являются числовыми типами и могут храниться в значении одного типа, каким типом будет i?

var i = 2, j = 3.4;

j, очевидно, является двойным, но i может логически быть либо целым, либо двойным, в зависимости от того, как вы ожидали, что var будет выводить типы. В любом случае, это может привести к путанице с людьми, которые ожидают, что это сработает иначе.

Чтобы избежать всей этой путаницы, это просто запрещено. Лично я не считаю это большой потерей, лично; если вы хотите объявить список переменных (что само по себе довольно редко встречается в моей работе), просто наберите em.

4 голосов
/ 09 февраля 2011

Я думаю, что это слишком ненадежно.Когда две переменные имеют одинаковый тип, это простой конкретный случай, но в более общем случае вам придется рассмотреть, что является «правильным» в коде, например:

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

Должны ли все они быть напечатаны какobject, так как это единственный тип, который у них всех общий?Или x должно быть object, y быть string и z быть int?

С одной стороны, вы можете думать о первом, поскольку переменные объявлены таким образом (все на одной строке), как правило, предполагается, что все они одного типа.С другой стороны, возможно, вы подумали бы, что это последнее, поскольку обычно предполагается, что ключевое слово var заставит компилятор выводить наиболее конкретный тип для вас.

Лучше всего вообще запретить это, чем работатьточно так, как он должен вести себя, учитывая, что это не совсем «убийственная» функция в любом случае.

Это мое мнение / предположение, по крайней мере.

1 голос
/ 09 февраля 2011

Я думаю, это потому, что для компилятора это может быть таким же, как:

var i = 2, j = "three"

И, конечно, они не того же типа.

...