具有泛型类型的可空默认参数
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);
}
这就是我在评论您分享相同方法的问题时的想法。
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);
}
我有一个带有一个通用参数和一个可选参数的方法。编译器在构造默认参数时似乎忽略了该类型的可空性。此行为似乎与使用相同类型声明局部变量的默认值的方式不一致。这是为什么?
我希望这对引用类型和值类型都有效(使用 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);
}
这就是我在评论您分享相同方法的问题时的想法。
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);
}