2014-10-01 2 views
0

У меня есть функция, которая принимает общий аргумент типа. Это довольно просто:Почему мне не требуется указывать аргументы типа в C#?

private static void Run<T>(IList<T> arg) 
{ 
    foreach (var item in arg) 
    { 
     Console.WriteLine(item); 
    } 
} 

Я обнаружил, что я могу назвать эту функцию без указания типа аргумента:

static void Main(string[] args) 
{ 
    var list = new List<int> { 1, 2, 3, 4, 5 }; 

    //both of the following calls do the same thing 
    Run(list); 
    Run<int>(list); 

    Console.ReadLine(); 
} 

Это компилирует и работает просто отлично. Почему это работает без указания аргумента типа? Как код знает, что T является int? Есть ли имя для этого?

+0

Это потому, что компилятор выводит тип из списка переданных в –

ответ

9

Тип вывода.

Те же правила для вывода типа применяются к статическим методам и методам экземпляров. Компилятор может вывести параметры типа на основе аргументов методы вы проходите в

http://msdn.microsoft.com/en-us/library/twcad0zb.aspx

7

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

От docs:

Компилятор может вывести параметры типа на основе метода аргументов, которые вы передаете; он не может вывести параметры типа только из ограничения или возвращаемого значения

Эрик Липперт также имеет интересное чтение по выбору перегрузки с дженериков: http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

3

Принятый ответ является правильным. Для получения более подробной информации, вот некоторые ресурсы для вас:

Видео мне объяснить, как определение типа изменилось в C# 3.0:

http://ericlippert.com/2006/11/17/a-face-made-for-email-part-three/

Как мы знаем, что процесс вывода типа не пойдет в бесконечный цикл?

http://ericlippert.com/2012/10/02/how-do-we-ensure-that-method-type-inference-terminates/

Почему ограничения не учитываются при умозаключения типа? Прочитайте комментарии в частности.

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx