泛型类空实例能否不指定泛型类型直接使用?
泛型类空实例调用的问题与解答
问题场景
当类包含泛型类型属性(如下方的Thingus<T>)时,能否在不指定该泛型属性类型的情况下,使用该类的空实例调用对应方法?
示例代码
using System; public class Program { public static void Main() { DoThing(new Thingus<int> { Name = "Integer thingus", Something = 42 }); //能否无需第19行的方法,让此调用生效? //若thingus为null,我不关心Something的类型。 //若不行,第19行方法使用的类型是否会影响性能? DoThing(); } public static void DoThing(Thingus<string> thingus = null) => DoThing<string>(thingus); public static void DoThing<T>(Thingus<T> thingus) { if(thingus is null) { Console.WriteLine("Oh look! The thingus is null!"); } else { Console.WriteLine($"Thingus's Something is {thingus.Something}"); } } } public class Thingus<T> { public string Name { get; set; } public T Something { get; set; } }
具体疑问
- 能否无需第19行的重载方法就让
DoThing()调用生效? - 若必须使用该重载,其指定的类型是否会对性能产生影响?
解答
是否需要重载方法
不行,必须保留第19行的重载,或者显式指定泛型类型调用(比如DoThing<string>())。C#的泛型是编译时确定类型的,DoThing<T>必须明确T的具体类型才能通过编译——哪怕参数是null,编译器也得知道T是什么类型来生成对应的泛型方法实例。直接调用DoThing()时,编译器没法自动推断T的类型,会直接编译报错。
重载方法的性能影响
完全不会有性能问题。当thingus为null时,DoThing<string>里根本不会执行任何涉及string类型的逻辑;另外,.NET的JIT编译器对于引用类型的泛型实例会共享同一份编译后的代码(只有值类型泛型才会为每个类型生成独立代码),所以指定string作为默认类型不会带来额外开销,null参数也不会触发多余操作。
内容的提问来源于stack exchange,提问作者Scott Pantall
相关产品推荐
相关产品推荐

