Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不需要在C中指定类型参数?_C#_Generic Type Argument - Fatal编程技术网

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

C# 为什么我不需要在C中指定类型参数?,c#,generic-type-argument,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> {

我有一个接受泛型类型参数的函数。这很简单:

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

类型推断

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


编译器可以根据您传入的参数推断类型

从:


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

Eric Lippert对泛型重载选择也有一个有趣的解读:
公认的答案是正确的。有关更多背景信息,请参阅以下资源:

我的一段视频解释了C 3.0中类型推断的变化:

我们如何知道类型推断过程不会进入无限循环

为什么在类型推断期间不考虑约束?请特别阅读评论


这是因为编译器根据您传入的列表推断类型