不指定类型的 C# 泛型方法

标签 c# .net generics .net-3.5 generic-method

好吧,我是一个开始使用 C# 的 Java 人,我正在编写代码并开始制作一个泛型方法,我编写的内容可以运行和编译,但它违背了我所知道的关于泛型应该如何工作的一切,所以我希望有人可以向我解释一下:

所以我有一个泛型方法定义如下:

public static List<T> CopyAsList<T>(IEnumerable<T> list, Object lockObject)  
{  
    if (list != null)  
    {  
        lock (lockObject)  
        {  
            return new List<T>(list);  
        }  
    }  
    return null;  
}  

但对我来说奇怪的是,我可以在不指定 T 的情况下调用这个通用方法,它会起作用:

List<String> strings = new List<string>() { "a", "b", "c"};
List<int> ints = new List<int>() { 1,2,3};
object lockObject = new object();

foreach (string s in CopyAsList(strings, lockObject))
{
    Console.WriteLine(s);
}

foreach (int i in CopyAsList(ints, lockObject))
{
    Console.WriteLine(i);
}

代码如何能够在不指定泛型类型的情况下进行编译? C# 是否在运行时推断类型?

最佳答案

不,它是在编译时推断的 - IEnumerable<T> 中的泛型类型参数你提供的被使用,这在编译时是已知的。一般来说,关于泛型和类型参数的一切都是在编译时指定的。如果存在任何类型的不匹配,编译器报错,您的代码将无法编译。

在某些极端情况下,您必须明确指定类型,这些情况仅在极少数情况下出现,方法重载,有时类型参数有多种组合。

关于不指定类型的 C# 泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4975364/

相关文章:

c# - 找不到类型或命名空间名称 'ImageEntitiesContainer'

Java 反射和泛型 - 参数化类型信息丢失 "extends"

generics - 如何重写这个通用参数?

c# - 动态创建方法,其中返回类型在编译时已知

c# - 如何在c#和wpf中实现scrollviewer bouncing的动画?

c# - 导航和重新实例化页面/ View 模型构造函数

c# - 为什么从 byte 到 sbyte 的转换会为优化代码提供错误的值?

c# - C#.NET内存泄漏:GC阶段1和阶段2运行时的锯齿状内存使用情况

.net - EF 4.1 Code First - 将枚举包装器映射为复杂类型

java - 比较 VS <?扩展比较>