Неявная типизация; почему только локальные переменные? - PullRequest
21 голосов
/ 05 мая 2009

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

var thingy = new Foo();

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

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

Ответы [ 6 ]

41 голосов
/ 05 мая 2009

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

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

7 голосов
/ 05 мая 2009

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

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

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

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

Причина этого:

Что если?

class Foo {}

var GetFoo() {
   return GetBar(); 
}

var GetBar() {
  return GetBaz(); 
}

var GetBaz() {
   return new Foo();
}

Вы могли бы сделать вывод, что GetFoo собирается вернуть Foo, но вам придется проследить через все вызовы, которые совершает метод и его children только для вывода тип. В нынешнем виде компилятор C # не предназначен для такой работы. Он нуждается в методах и типах полей на ранних стадиях процесса, прежде чем код, который выводит типы, может быть запущен.

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

Я думаю, что лучше использовать методы var для динамических языков, таких как Ruby

1 голос
/ 05 мая 2010

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

Dynamic getFoo() { 
    return new Foo();  
} 
1 голос
/ 05 мая 2009

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

1 голос
/ 05 мая 2009

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

0 голосов
/ 05 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...