C# 7.3 枚举约束:为什么我不能使用可为空的枚举?
C# 7.3 Enum constraint: Why can't I use the nullable enum?
既然我们有了枚举约束,为什么编译器不允许我写这段代码?
public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
where TResult : Enum
{
return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
编译器说:
Error CS0453 The type 'TResult' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable'
因为 System.Enum
是 class,您不能声明类型 Nullable<Enum>
的变量(因为 Nullable<T>
只有在 T
是 struct
).
因此:
Enum? bob = null;
不会编译,你的代码也不会。
这绝对很奇怪(因为 Enum
本身是一个 class,但是您在代码中定义的特定 Enum
是一个 struct
)如果您没有之前没有 运行,但根据 docs 和源代码,它显然是 class
(不是 struct
)。
可以,但必须添加另一个约束:struct
约束。
public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}
既然我们有了枚举约束,为什么编译器不允许我写这段代码?
public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
where TResult : Enum
{
return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}
编译器说:
Error CS0453 The type 'TResult' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'Nullable'
因为 System.Enum
是 class,您不能声明类型 Nullable<Enum>
的变量(因为 Nullable<T>
只有在 T
是 struct
).
因此:
Enum? bob = null;
不会编译,你的代码也不会。
这绝对很奇怪(因为 Enum
本身是一个 class,但是您在代码中定义的特定 Enum
是一个 struct
)如果您没有之前没有 运行,但根据 docs 和源代码,它显然是 class
(不是 struct
)。
可以,但必须添加另一个约束:struct
约束。
public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}