C#7.3枚举约束:为什么我不能使用可空的枚举?

时间:2018-05-15 13:32:03

标签: c# enums roslyn c#-7.3

现在我们有枚举约束,为什么编译器不允许我编写这段代码?

public static TResult? ToEnum<TResult>(this String value, TResult? defaultValue)
    where TResult : Enum
{
    return String.IsNullOrEmpty(value) ? defaultValue : (TResult?)Enum.Parse(typeof(TResult), value);
}

编译器说:

  

错误CS0453类型&#39; TResult&#39;必须是不可为空的值类型才能将其用作参数&#39; T&#39;通用类型或方法&#39; Nullable&#39;

2 个答案:

答案 0 :(得分:48)

您可以,但必须添加另一个约束:struct约束。

public static void DoSomething<T>(T? defaultValue) where T : struct, Enum
{
}

答案 1 :(得分:15)

由于db.Foo.aggregate([{ $match: { obj: { $in: ["<uuid>", "<uuid>"] } } },{ $sort: { lm: -1 } },{ $group: { _id: "$obj", ts: { $first: "$ts" } } }]);是一个类,因此您无法声明System.Enum类型的变量(因为只有Nullable<Enum>Nullable<T>时才可以T)。

因此:

struct

将无法编译,您的代码也不会编译。

这绝对很奇怪(因为Enum? bob = null; 本身就是一个类,但是如果你之前没有遇到它,那么你在代码中定义的特定EnumEnum ,但根据docs和源代码显然是struct(不是class)。