Почему С# не позволяет объявлять несколько переменных с помощью var?
Учитывая следующее:
// 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;
который компилируется.
Ответы
Ответ 1
Это просто еще один момент возможной путаницы для программиста и компилятора.
Например, это нормально:
double i = 2, j = 3.4;
но что это значит?
var i = 2, j = 3.4;
С синтаксическим сахаром такая вещь - головная боль, которой никто не нуждается - поэтому я сомневаюсь, что ваш случай когда-нибудь будет поддержан. Это связано с слишком большим количеством компилятора, пытающегося быть немного умным.
Ответ 2
Когда мы разработали эту функцию, я спросил сообщество, что
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 double.
(Языковой комитет указал, что он должен быть "двойным", и я фактически реализовал этот код задолго до того, как мы отправили его. Мы использовали алгоритм вывода того же типа, что и для неявно типизированных массивов, где все выражения должны быть конвертируемый в лучший тип элемента.)
Когда половина вашей клиентской базы думает, что одна вещь "явно правильная", а другая половина считает, что противоположность "явно правильная", тогда у вас на руках большая проблема с дизайном. Решение было сделать все незаконным и избежать проблемы.
Ответ 3
Потому что если это сработало:
var i = 2, j = 3;
потому что это работает:
var i = 2;
var j = 3;
то вы можете ожидать, что это сработает:
var i = 2, j = "3";
потому что это работает:
var i = 2;
var j = "3";
Даже в случае, установленном Джеймсом Гонтом, где они оба являются числовыми типами и могут быть сохранены в одном и том же типе, какой тип был бы i
be?:
var i = 2, j = 3.4;
j
, очевидно, является двойным, но i
может логически быть либо int, либо double, в зависимости от того, как вы ожидали, что var выведет типы. В любом случае это было реализовано, вы можете вызвать путаницу с людьми, которые ожидали, что он будет работать другим способом.
Чтобы избежать всего этого путаницы, это просто запрещено. Лично я лично не воспринимаю это как большую потерю; если вы хотите объявить список переменных (что очень редко встречается в моем опыте работы), просто сильно введите em.
Ответ 4
Я думаю, что это слишком плохо. Когда две переменные являются одним и тем же типом, это простой конкретный случай, но в более общем случае вам нужно будет рассмотреть, что "правильно" в коде, например:
var x = new object(), y = "Hello!", z = 5;
Должны ли эти все быть напечатаны как object
, так как это единственный тип, который у всех есть? Или x
be object
, y
be string
, а z
be int
?
С одной стороны, вы можете подумать о первом, поскольку переменные, объявленные таким образом (все в одной строке), обычно считаются одинаковыми. С другой стороны, возможно, вы думаете, что это последнее, поскольку ключевое слово var
обычно должно заставить компилятор вывести для вас наиболее специфический тип.
Лучше просто запретить это вообще, чем беспокоиться о том, как он должен себя вести, учитывая, что в любом случае это не будет "убийцей".
Это мое мнение/предположение, по крайней мере.
Ответ 5
Я думаю, что для компилятора это может быть то же самое, что:
var i = 2, j = "three"
И, конечно же, они не одного типа.