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

StackOverflow https://stackoverflow.com/questions/824739

Вопрос

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

var thingy = new Foo();

Но почему нет...

var getFoo() {
    return new Foo(); 
}
Это было полезно?

Решение

Эрик Липперт написал на эту тему целый пост в блоге.

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

Другие советы

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

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

Почему нет?

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top