Вопрос

Насколько хорош вывод типов в 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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top