You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泛型类空实例能否不指定泛型类型直接使用?

泛型类空实例调用的问题与解答

问题场景

当类包含泛型类型属性(如下方的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 03:18:16