请注意,这个问题的前提是一个可空上下文,这是NET 6的默认设置。
我想编写一个方法
这个示例方法应该返回null,确实对于类、可为空的类和可为空的值类型,它也是返回null,但对于值类型则不是。
我希望有一种方法,可以对所有这些情况都返回 true。我已经尝试了许多在 T 上的 constraints 限制。我感觉
我可以只创建两个方法,一个受限于
我想编写一个方法
Read
,它接受一个非空类型(即结构体或类),并输出该结构体或类的可空版本。类似于这样(显然它不只是返回默认值,但没有必要复杂化这个问题):public static T? Read<T>()
{
return default; //should return null
}
这个示例方法应该返回null,确实对于类、可为空的类和可为空的值类型,它也是返回null,但对于值类型则不是。
Console.WriteLine(null == Read<string>()); //true
Console.WriteLine(null == Read<string?>()); //true
Console.WriteLine(null == Read<int>()); //false
Console.WriteLine(null == Read<int?>()); //true
我希望有一种方法,可以对所有这些情况都返回 true。我已经尝试了许多在 T 上的 constraints 限制。我感觉
notnull
限制应该可以工作,但它并没有。我可以只创建两个方法,一个受限于
struct
(即值类型),另一个受限于 class
(即非空引用类型)。以下方法可行:public static T? ReadValue<T>() where T: struct
{
return null; //does return null
}
public static T? ReadRef<T>() where T: class
{
return null; //does return null
}
但是,正如您所看到的,这两种方法如果没有约束和不同的名称将完全相同(需要不同的名称是因为它们具有相同的签名)。因此,我觉得必须为此创建两种不同的方法似乎有些愚蠢。
背景:我知道这种情况的笨拙部分是由于可空值类型在幕后由Nullable<T>
表示,而可空类只是由编译器跟踪。我只想知道是否有一种避免这种情况的方法。