C# 7.3 处理通用枚举约束的可能错误

Possible bug in C# 7.3 handling of generic Enum constraints

以下代码无法在 C# 7.3 中编译,即使它确实支持约束为枚举的泛型:

using System;
public class Test<T> where T: Enum
{
    public void Method()
    {
        if (!Enum.TryParse<T>("something", out var value))
            throw new Exception("Oops");
    }
}

我使用 Enum 约束的其他代码确实有效,所以我拥有所有内容的正确版本,它似乎无法调用另一个也被约束为 Enum.

这是一个错误还是我误解了它应该如何工作。

你需要一个额外的约束:

public class Test<T> where T: struct, Enum
{
    public void Method()
    {
        if (!Enum.TryParse<T>("something", out var value))
            throw new Exception("Oops");
    }
}

只要 where T : Enum,您就可以调用 new Test<Enum>().Method();——即传入 Enum 类型,而不是任何特定类型的枚举。添加 struct 意味着您必须传入特定类型的枚举。

更具体地说,Enum.TryParse<T> 具有约束 where T : struct,因此您需要在方法中匹配此约束。