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

Неявная типизация; почему только локальные переменные?

Кто-нибудь знает или не хочет размышлять, почему неявное типирование ограничено локальными переменными?

var thingy = new Foo();

Но почему бы и нет...

var getFoo() {
    return new Foo(); 
}
4b9b3361

Ответ 1

Эрик Липперт сделал целую запись в блоге по этому вопросу.

Таким образом, основная проблема заключается в том, что для этого потребовалась бы большая переструктура компилятора С#. Объявления обрабатываются в один проход. Это потребует нескольких проходов из-за возможности создавать циклы между выведенными переменными. У VB.net есть примерно такая же проблема.

Ответ 2

У Джареда есть фантастическая ссылка в его ответе, на фантастическую тему.

Я думаю, что он не отвечает на вопрос явно.

Почему бы и нет?

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

Ответ 3

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

Ответ 4

По сути, проблема, с которой вы сталкиваетесь, заключается в том, что С# (пока) является статически типизированным языком. Локальная переменная, определенная как var, все еще статически типизирована, но синтаксически скрыта. С другой стороны, метод, возвращающий var, имеет много последствий. Он становится скорее интерфейсом для использования, и вы ничего не получаете, используя var.

Ответ 5

вы можете использовать в vs 2010 Динамический

Dynamic getFoo() { 
    return new Foo();  
} 

Ответ 6

Я думаю, это связано с тем, что объем этого подразумеваемого типа намного шире и, следовательно, более вероятно, вызовет проблемы, чем в рамках одного метода.