【问题标题】:Can't cast an `Enum` value to `int` in a generic method无法在通用方法中将“枚举”值转换为“int”[重复]
【发布时间】:2020-12-06 22:21:17
【问题描述】:

如果我有enum...

public enum Frequency {
  OneOff = 0,
  Monthly = 1,
  Quarterly = 2,
  Annually = 3
}

...那么我可以做这样的事情...

int n = (int)Frequency.Annually; 

鉴于从 C# 7.3 开始,我们能够使用 Enum 作为通用约束,我希望能够做到这一点......

public void Stuff<T>(T val) where T : Enum {
  int v = (int)val;
}

...但是编译器抱怨说它无法将类型 T 转换为 int

谁能给我解释一下?泛型约束告诉编译器Tenum,并且(除非您特别做不同)enum 值可以转换为int

【问题讨论】:

  • 我不明白为什么这个问题被关闭了。上面的问题是要求理解为什么不能做某事。在这种情况下 - enum 本身可以继承自 'short'、'byte'、'int' 等。因此编译器无法判断 Enum 的父类型是什么。结束此问题的参考答案是一种破解/解决方法 - 不应在复杂的编码环境中完成。

标签: c# generics enums


【解决方案1】:

枚举可以是很长的或其他的东西

public static void Stuff<T>(T val) where T : System.Enum, IConvertible
{
    int v = val.ToInt32(null);
}

这行得通

如果您查看 Enum,您会发现它没有表示为 int。 实际的基类和实现是:

public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible

顺便说一句:比 int 更喜欢 long,因为 long 被用作枚举中的标志以允许 64 个标志

【讨论】:

  • 谢谢,这表明您可以从阅读文档中学到很多东西!我曾尝试过IConvertible,但没有成功,我求助于Convert.ToInt32()。这行得通,但它让我觉得我的第一行代码运行良好。我想知道它是否可以通用。我现在看到它不能。谢谢。
猜你喜欢
  • 1970-01-01
  • 2017-08-17
  • 1970-01-01
  • 2011-07-10
  • 2011-05-09
  • 2013-06-26
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多