Насколько хорош вывод типа C #? - PullRequest
17 голосов
/ 26 января 2009

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

Ответы [ 3 ]

40 голосов
/ 26 января 2009

В C # существует несколько основных типов вывода типов:

  • Неявно типизированные локальные переменные:

    • Только для локальных переменных
    • Только когда значение присваивается как часть объявления
    • Значение не может быть нулевым
    • Значение не может быть лямбда-выражением, анонимным методом или группой методов (без преобразования)
    • Тип значения времени компиляции используется для типа переменной
    • Любое дальнейшее использование переменной проверяется только по типу, определенному в первоначальном объявлении + присваивании; они не способствуют самому выводу.
  • Вывод аргументов типа общего метода, т. Е. Вы не указываете аргументы типа при вызове универсального метода, компилятор вычисляет их на основе аргументов.

    • Было бы очень удобно иметь это как для универсальных типов, так и для универсальных методов
    • В любом случае, действительно удобно - LINQ было бы трудно или невозможно использовать без него
    • Без него анонимные типы были бы довольно бесполезны
    • Действительно сложные правила, даже спецификация неверна в некоторых местах
  • Вывод типа параметра лямбда-выражения

    • Компилятор пытается определить типы параметров для лямбда-выражений на основе контекста, в котором он используется
    • Обычно работает довольно хорошо, по моему опыту
  • Вывод типа массива, например new[] { "Hi", "there" } вместо new string[] { "Hi", "there" }

    • Различные небольшие ограничения, ничего особенного

Я, вероятно, забыл некоторые другие функции, которые можно было бы назвать "вывод типа". Я подозреваю, что вас больше всего интересует первое, но другие могут быть актуальны и для вас:)

7 голосов
/ 26 января 2009

Может использоваться только для локальных переменных, но может определять тип во многих различных формах.

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

РЕДАКТИРОВАТЬ: Еще один пример вывода Tye с 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.
1 голос
/ 26 января 2009

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

...