【问题标题】:Enum.TryParse not accepted in generic restricted to EnumEnum.TryParse 在仅限于 Enum 的泛型中不被接受
【发布时间】:2020-11-11 17:09:30
【问题描述】:

我认为我可能在做一些愚蠢的事情,但我正在尝试编写一个通用函数,该函数接受 string 并将其转换为 enum(然后执行一些我已经跳过的其他内容)简洁)。 问题是,它抱怨 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 的示例,但看不出我做错了什么。

【问题讨论】:

  • 你不应该用变量名来隐藏你的参数名。为out T value? value : 使用不同的名称
  • @ckuri:已经有答案表明
  • 抱歉,在简化我的 SO 代码时出现了一些错误。感谢@HereticMonkey 指出错误

标签: c# generics enums


【解决方案1】:

看似 System.Enum 可以为空,但实际的枚举不能为空。

是的,就像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");

【讨论】:

  • 感谢@Jon 的快速解答。我已经修复了在简化 SO 时引入的问题中的代码错误,但是我缺少的是 struct 的超级简单添加。
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 2013-09-15
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2016-01-06
  • 2021-03-04
  • 2023-04-09
相关资源
最近更新 更多