首页 > 解决方案 > 无法在通用方法中将“枚举”值转换为“int”

问题描述

如果我有一个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;
}

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

任何人都可以向我解释这个?泛型约束告诉编译器这T是一个enum,并且(除非你特别做不同的事情)一个enum值可以转换为一个int

标签: c#genericsenums

解决方案


enum 可以是很长的或其他的东西

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 个标志


推荐阅读