Подтвердить что ты не робот

Почему С# не позволяет объявлять несколько переменных с помощью 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;

который компилируется.

4b9b3361

Ответ 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"

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