Насколько хорош вывод типа С#? Я где-то читал, что это только для локальных переменных? Он работает для атрибутов уровня класса? Для сигнатур методов? Типы возвращаемых методов? и др.
Насколько хорош вывод типа С#?
Ответ 1
В С# существует несколько основных типов вывода типов:
-
Неявно введенные локальные переменные:
- Только для локальных переменных
- Только когда значение присваивается как часть объявления
- Значение не может быть null
- Значение не может быть лямбда-выражением, анонимным методом или группой методов (без трансляции)
- Тип значения времени компиляции используется для типа переменной
- Любое дальнейшее использование переменной проверяется только на тип, определяемый начальным объявлением + присвоением; они не вносят вклад в сам вывод.
-
Вывод аргумента типа универсального метода, т.е. вы не указываете аргументы типа при вызове общего метода, компилятор вычисляет их на основе аргументов.
- Было бы очень удобно иметь это для общих типов, а также для общих методов.
- Действительно в любом случае - LINQ будет трудно или невозможно использовать без него
- Анонимные типы были бы бесполезны без него
- Действительно сложные правила, даже спецификация ошибочна в нескольких местах
-
Вывод типа параметра выражения Lambda
- Компилятор пытается выработать типы параметров для лямбда-выражений на основе контекста, в котором он использовался
- Обычно работает очень хорошо, по моему опыту
-
Вывод типа массива, например.
new[] { "Hi", "there" }
вместоnew string[] { "Hi", "there" }
- Различные небольшие ограничения, ничего существенного
Возможно, я забыл некоторые другие функции, которые можно назвать "вывод типа". Я подозреваю, что вас больше всего интересует первое, но другие могут быть для вас также важны:)
Ответ 2
Он может использоваться только для локальных переменных, но он может определять тип во многих разных формах.
var myVar = SomeMethodThatReturnsInt(); //will know it an int
var myIntList = new List<int>(); //this works too (although this is technically not type inference)
var myOwnVar = new { Name = "John", Age = 100 }; // will create own type and infer that
EDIT: Еще один пример Tye Inference - с Lambdas. IE:
var myList = new List<int>();
//add some values to list
int x = myList.Find(i => i == 5); // compiler can infer that i is an int.
Ответ 3
Он работает только с локальными переменными, насколько я понимаю.