Насколько хорош вывод типа в C#?
-
20-08-2019 - |
Вопрос
Насколько хорош вывод типов в C#?Я где-то читал, что это только для локальных переменных?Работает ли это для атрибутов уровня класса?Для сигнатур методов?Типы возвращаемых методов?и т. д.
Решение
В C# существует несколько основных видов вывода типа:
Неявно типизированные локальные переменные:
- Только для локальных переменных
- Только когда значение присваивается как часть объявления
- Значение не может быть нулевым
- Значение не может быть лямбда-выражением, анонимным методом или группой методов (без приведения).
- Тип значения времени компиляции используется в качестве типа переменной.
- Любое дальнейшее использование переменной проверяется только на соответствие типу, определенному исходным объявлением+присваиванием;они не способствуют самому выводу.
Вывод аргументов типа общего метода, т.е.вы не указываете аргументы типа при вызове универсального метода, компилятор определяет их на основе аргументов.
- Было бы очень удобно иметь это как для универсальных типов, так и для универсальных методов.
- В любом случае, очень удобно — без него LINQ было бы сложно или невозможно использовать.
- Без него анонимные типы были бы совершенно бесполезны.
- Действительно сложные правила, даже спецификация в некоторых местах неверна.
Вывод типа параметра лямбда-выражения
- Компилятор пытается определить типы параметров лямбда-выражений в зависимости от контекста, в котором они используются.
- Обычно работает очень хорошо, по моему опыту
Вывод типа массива, например.
new[] { "Hi", "there" }
вместоnew string[] { "Hi", "there" }
- Различные небольшие ограничения, ничего серьезного
Я, вероятно, забыл некоторые другие функции, которые можно было бы назвать «выведением типа».Подозреваю, что вас больше всего интересует первое, но и остальные могут быть вам интересны :)
Другие советы
Его можно использовать только для локальных переменных, но он может определять тип во многих различных формах.
var myVar = SomeMethodThatReturnsInt(); //will know it's 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
РЕДАКТИРОВАТЬ:Еще один пример вывода Тайя — использование Lambdas.ИЕ:
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.
Насколько я понимаю, он работает только с локальными переменными.