C# 7.3中泛型枚举约束处理存在可能的 bug

3
以下代码虽然支持泛型约束为枚举,但在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的方法。

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


1
请问您能否将编译器错误信息添加到问题描述中? - Ashigore
你遇到了什么错误? - Chetan
1个回答

7

你需要增加一个额外的限制条件:

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,因此您需要匹配此约束在您的方法中。

TryParse 代码 - ProgrammingLlama
可以解释一下为什么吗?由于Enum.TryParse<T>具有相同的where T:Enum约束,我希望这能够运行,并且发现这个结果非常令人惊讶。 - bikeman868
@bikeman868 我已经编辑了我的回答。Enum.TryParse<T> 的约束条件是 where T : struct,而不是 where T : Enum 请参见此处 - canton7
我做了一些阅读,为了澄清:Enum是一个类,但特定类型的枚举是一个struct。因此,Enum约束将其限制为Enum类或继承自Enum的类,并且额外的struct约束意味着它也必须是一个struct,只有特定的枚举类型具有这些特征。 - bikeman868
@bikeman868 是的,这就是我第一段想要解释的。 - canton7
直到我去阅读了一些资料,你的解释对我来说才变得有意义。从你的解释中让我感到困惑的部分是,当我编写 public enum MyEnum {} 时,MyEnum 是一个继承自 Enum 类的结构体。这对我来说很奇怪和反直觉。 - bikeman868

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接