为什么当 T 被约束为枚举时,返回 default(T?) 不给出空值?



我有一个解析器,可以将文本文件渲染到数据模型中。有些字段是可选的,它们在模型中表示为null。

然而,一个奇怪的行为让我头疼。当我具体处理nullable时,它的行为与预期的一样。

Foo? a = null;

效果很好。

Foo? b = default(Foo?);

工作也很好。b为空。

然而,每当我将其封装在泛型类中时,它似乎很难以相同的方式处理泛型类型参数。

void Main()
{
Foo? is_null = null;
Foo? is_also_null = default (Foo?);
Foo? does_not_work = FooClass.GetNull<Foo>();
Foo? is_not_null = FooClass.GetDefault<Foo>();   // Should be null, AFAICT, but isn't,

}
public static class FooClass
{
public static T? GetNull<T>() where T:System.Enum
{
return null;  //Compile error: CS0403 Cannot convert null to type parameter 'T' because it could be a non-nullable value type. Consider using 'default(T)' instead.
}
public static T? GetDefault<T>() where T : System.Enum
{
return default(T?); // Why does this not return null? Shouldn't this be the same as default(Foo?) ?
}
}
public enum Foo
{
one,two,three
}

我做错了什么?或者我在这里错过了什么?

enum约束基本上是:不要按预期工作;T : Enum并不意味着它将其视为基元,而是将其视为装箱值(对象),它恰好是Enum类型(或Enum本身!)的子类型。强调:请记住,您本可以在此处使用GetDefault<Enum>

如果没有支持Nullable Reference Types的编译器,并且禁用了NRT支持和NRT,T?甚至无法编译:它将向您发出CS8632警告;这意味着这里的T?是指NRT,而不是Nullable<T>。你可以通过添加T : struct, Enum来解决这个问题,但没有:default(T?)default(T)是一样的(因为NRT的?不会改变类型语义——不管我们是否期望null),而default(T)是零枚举。

最新更新