c# - Enum.TryParse 在仅限于 Enum 的泛型中不被接受

标签 c# generics enums

我想我可能在做一些愚蠢的事情,但我正在尝试编写一个通用函数,它接受一个字符串并将其转换为枚举(然后执行为了简洁起见,我跳过了一些其他内容)。 问题是,它提示 Enum.TryParse 需要一个不可为空的类型,它提示 T 可以为空;表面上 System.Enum 可以为空,但实际枚举不可为空。 我在这里做错了什么,或者有办法解决这个问题。

private T GetEnumFilter<T>(string strValue) where T : Enum
{
     return Enum.TryParse(strValue, out T value) ? value : throw new Exception("Invalid value");
}

我见过这个https://stackoverflow.com/a/8086788/1093406答案和示例位于 the dotnet samples并且看不到我做错了什么。

最佳答案

Seemingly System.Enum is nullable but actual enums aren't nullable.

是的,就像System.ValueType是引用类型一样,但值类型本身不是。

您只需要添加一个struct约束:

private T GetEnumFilter<T>(string value) where T : struct, Enum

编译,例如:

private static T GetEnumFilter<T>(string value) where T : struct, Enum =>
    Enum.TryParse(value, out T result) ? result : throw new Exception("Invalid value");

关于c# - Enum.TryParse 在仅限于 Enum 的泛型中不被接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64790983/

相关文章:

c# - 比较枚举与类,最佳实践?

c# - 当有两个 watch 实例时,StopWatch 返回 0ms

.net - 列表泛型 - 隐式转换

java - 静态方法使用泛型创建内部类

java - 封闭类中的私有(private)枚举和静态字段

c# - UWP AutoSuggestBox QueryIcon 在添加样式后消失

c# - 在 Controller 上下文可用之前查找请求是否为子操作请求

java - 如何指定无界通配符类型参数?

java - 从唯一实例值创建枚举工厂方法

python - 在 python 和 arduino 之间共享枚举