为什么我不需要在C#中指定类型参数
本文关键字:类型参数 不需要 为什么 | 更新日期: 2023-09-27 18:25:11
我有一个接受泛型类型参数的函数。很简单:
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?这个有名字吗?
类型推理。
类型推理的相同规则适用于静态方法和实例方法。编译器可以根据您在中传递的方法参数推断类型参数
http://msdn.microsoft.com/en-us/library/twcad0zb.aspx
编译器可以根据传入的参数推断类型。.
来自文档:
编译器可以根据方法推断类型参数你传递的论点;它不能仅从限制或返回值
Eric Lippert还对泛型的过载选择进行了有趣的解读:http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx
接受的答案是正确的。有关更多背景信息,这里有一些资源可供您参考:
我的一段视频解释了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