具有泛型类型的可空默认参数

Nullable default parameter with generic type

我有一个带有一个通用参数和一个可选参数的方法。编译器在构造默认参数时似乎忽略了该类型的可空性。此行为似乎与使用相同类型声明局部变量的默认值的方式不一致。这是为什么?

我希望这对引用类型和值类型都有效(使用 null 作为可选参数)。

public static void Main()
{
    int? @defaultInt = default;
    Console.WriteLine(defaultInt is null ? "null" : defaultInt); // null
            
    Do<int>(); // 0, not null

}

public static void Do<U>(U? p = default)
{
    Console.WriteLine(p is null ? "null" : p);
}

您需要做的就是有 2 个具有不同约束的重载

public static void Do<U>(U p = default) where U : class
{
    Console.WriteLine(p is null ? "null" : p);
}

public static void Do<U>(U? p = default) where U : struct
{
    Console.WriteLine(p is null ? "null" : p);
}

实例:https://dotnetfiddle.net/iOzGDb

这就是我在评论您分享相同方法的问题时的想法。

static void Main(string[] args)
{
    int? defaultInt = default;
    Console.WriteLine(defaultInt is null ? "null" : defaultInt); //null

    Do<string>(); // 0, not null
}

public static void Do<U>(U? p = default) where U : struct
{
    DoIt(p);
}

public static void Do<U>(U? p = default) where U : class
{
    DoIt(p);
}

private static void DoIt<U>(U? p)
{
    Console.WriteLine(p is null ? "null" : p);
}