Кто-нибудь знает или не хочет размышлять, почему неявное типирование ограничено локальными переменными?
var thingy = new Foo();
Но почему бы и нет...
var getFoo() {
return new Foo();
}
Кто-нибудь знает или не хочет размышлять, почему неявное типирование ограничено локальными переменными?
var thingy = new Foo();
Но почему бы и нет...
var getFoo() {
return new Foo();
}
Эрик Липперт сделал целую запись в блоге по этому вопросу.
Таким образом, основная проблема заключается в том, что для этого потребовалась бы большая переструктура компилятора С#. Объявления обрабатываются в один проход. Это потребует нескольких проходов из-за возможности создавать циклы между выведенными переменными. У VB.net есть примерно такая же проблема.
У Джареда есть фантастическая ссылка в его ответе, на фантастическую тему.
Я думаю, что он не отвечает на вопрос явно.
Почему бы и нет?
var getFoo() {
return new Foo();
}
Причиной этого является:
Что делать?
class Foo {}
var GetFoo() {
return GetBar();
}
var GetBar() {
return GetBaz();
}
var GetBaz() {
return new Foo();
}
Вы можете сделать вывод, что GetFoo
будет возвращать Foo
, но вам придется трассировать через все вызовы, которые этот метод делает, а его дети делают только вывести тип. В его нынешнем виде компилятор С# не предназначен для работы таким образом. В начале процесса ему нужны методы и типы полей до того, как код, который вводит типы, может работать.
На чисто эстетическом уровне я нахожу определения var в методах путают вещи. Его одно место, где я думаю, что явное всегда помогает, оно защищает вас от того, чтобы стрелять в себя ногой, случайно возвращая тип, из-за которого ваша подпись и тонна других зависимых сигнатур методов изменяются. Хуже того, вы могли бы потенциально изменить все ваши подписи цепочки методов, даже не зная, что вы сделали это, если вы вернете значение метода, возвращающего объект, и ему повезло.
Я думаю, что методы var лучше всего оставить для динамических языков, таких как Ruby
Потому что это гораздо проще сделать. Если бы вы сделали вывод о всех типах, нужно было бы что-то вроде системы вывода типа Hindley Milner, которая сделает ваш любимый С# на языке производных Haskel.
По сути, проблема, с которой вы сталкиваетесь, заключается в том, что С# (пока) является статически типизированным языком. Локальная переменная, определенная как var, все еще статически типизирована, но синтаксически скрыта. С другой стороны, метод, возвращающий var, имеет много последствий. Он становится скорее интерфейсом для использования, и вы ничего не получаете, используя var.
вы можете использовать в vs 2010 Динамический
Dynamic getFoo() {
return new Foo();
}
Я думаю, это связано с тем, что объем этого подразумеваемого типа намного шире и, следовательно, более вероятно, вызовет проблемы, чем в рамках одного метода.