'Can't cast an `Enum` value to `int` in a generic method
If I have an enum...
public enum Frequency {
OneOff = 0,
Monthly = 1,
Quarterly = 2,
Annually = 3
}
...then I can do something like this...
int n = (int)Frequency.Annually;
Given that since C# 7.3, we are able to use Enum as a generic constraint, I expected to be able to do this...
public void Stuff<T>(T val) where T : Enum {
int v = (int)val;
}
...but the compiler complains, saying it can't convert type T to int.
Anyone able to explain this to me? The generic constraint tells the compiler that T is an enum, and (unless you specifically do it differently) an enum value can be cast to an int.
Solution 1:[1]
enum can be a long or other things
public static void Stuff<T>(T val) where T : System.Enum, IConvertible
{
int v = val.ToInt32(null);
}
This works
If you look at Enum you can see that its not stated as an int. The actual base classes and implementations are:
public abstract class Enum : ValueType, IComparable, IFormattable, IConvertible
BTW: prefer long over int since longs are used as Flags in enumns to allow 64 flags
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
