为什么我不需要在C#中指定类型参数?

时间:2014-10-01 17:20:35

标签: c# generic-type-argument

我有一个带泛型类型参数的函数。这非常简单:

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?这有名字吗?

3 个答案:

答案 0 :(得分:9)

类型推断。

  

类型推断的相同规则适用于静态方法和实例方法。编译器可以根据您传入的方法参数推断类型参数

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

答案 1 :(得分:7)

编译器可以从您传入的参数中推断出类型..

来自docs

  

编译器可以根据方法推断类型参数   你传递的论据;它不能只从a推断出类型参数   约束或返回值

Eric Lippert还有一篇关于带泛型的过载选择的有趣读物: http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

答案 2 :(得分: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