Ответ 1
В С# существует несколько основных типов вывода типов:
-
Неявно введенные локальные переменные:
- Только для локальных переменных
- Только когда значение присваивается как часть объявления
- Значение не может быть null
- Значение не может быть лямбда-выражением, анонимным методом или группой методов (без трансляции)
- Тип значения времени компиляции используется для типа переменной
- Любое дальнейшее использование переменной проверяется только на тип, определяемый начальным объявлением + присвоением; они не вносят вклад в сам вывод.
-
Вывод аргумента типа универсального метода, т.е. вы не указываете аргументы типа при вызове общего метода, компилятор вычисляет их на основе аргументов.
- Было бы очень удобно иметь это для общих типов, а также для общих методов.
- Действительно в любом случае - LINQ будет трудно или невозможно использовать без него
- Анонимные типы были бы бесполезны без него
- Действительно сложные правила, даже спецификация ошибочна в нескольких местах
-
Вывод типа параметра выражения Lambda
- Компилятор пытается выработать типы параметров для лямбда-выражений на основе контекста, в котором он использовался
- Обычно работает очень хорошо, по моему опыту
-
Вывод типа массива, например.
new[] { "Hi", "there" }
вместоnew string[] { "Hi", "there" }
- Различные небольшие ограничения, ничего существенного
Возможно, я забыл некоторые другие функции, которые можно назвать "вывод типа". Я подозреваю, что вас больше всего интересует первое, но другие могут быть для вас также важны:)