Подтвердить что ты не робот

Насколько хорош вывод типа С#?

Насколько хорош вывод типа С#? Я где-то читал, что это только для локальных переменных? Он работает для атрибутов уровня класса? Для сигнатур методов? Типы возвращаемых методов? и др.

4b9b3361

Ответ 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

Он работает только с локальными переменными, насколько я понимаю.