【问题标题】:Cast enum-value in generic method to int [duplicate]将泛型方法中的枚举值转换为 int [重复]
【发布时间】:2021-01-04 13:59:11
【问题描述】:

我创建了一个通用方法。类型参数可以是任何枚举:

private AdditionalFields GetAdditionalFields<T>(params T[] fields) where T : struct, Enum
{
  var fieldTextList = new List<string>();
  foreach ( var field in fields )
  {
    fieldTextList.Add($"F{(int)field}");   // <- Error here
  }
  // ... do logic
  return ...
}

当我尝试将枚举值转换为整数时,我收到编译器错误“无法将类型 'T' 转换为 'int'。

谁能解释一下,为什么会这样? T 始终是一个枚举,因此应该能够转换为 int - 还是不?

【问题讨论】:

  • 并非所有枚举都在内部使用int——您可以定义一个使用任何整数类型的枚举。编译器不知道你给了它什么类型,所以它不知道用什么指令把它转换成 int。你可以使用Convert.ToInt32(field),虽然你会招致一个盒子
  • @canton7:您说的完全正确,但答案框稍微靠下一点。 :-)
  • @Heinzi 这个答案肯定是重复的——我以前回答过类似的问题。重复的答案被否决了,但在我点击搜索框之前,我希望至少有一点帮助。也就是说,Serg 的方法可以更好地回答这个具体问题,所以我不会将其标记为 dup
  • @xanatos 同意。但是,这是这样的——如果我没有写,我可以保证,有人会不遗余力地指出这一点。我发现最好提前提及这类东西以将其扼杀在萌芽状态(事实证明,在这种情况下它不起作用)
  • @OlivierRogier 它阻止某人写 GetAdditionalFields&lt;Enum&gt;(...) -- Enum 约束允许 T 成为 Enum 本身:添加 struct 强制 T 成为特定类型枚举。

标签: c# generics enums generic-method


【解决方案1】:

我认为,最好使用枚举特定的格式字符串来获取枚举的整数表示(一般意义上的整数,不仅仅是int32)

fieldTextList.Add($"F{field:D}");

您可以在此处找到有关枚举格式说明符的更多信息:https://docs.microsoft.com/en-us/dotnet/standard/base-types/enumeration-format-strings#d-or-d

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多