c# - 无法在通用方法中将“枚举”值转换为“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;
}
...但是编译器抱怨说它无法将类型转换T
为int
.
任何人都可以向我解释这个?泛型约束告诉编译器这T
是一个enum
,并且(除非你特别做不同的事情)一个enum
值可以转换为一个int
。
解决方案
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 个标志
推荐阅读
- reactjs - 为什么即使包装类呈现输入框,我的 React 输入框也不呈现延迟响应 - React with Redux
- android - 未安装 Flutter 插件;这增加了 Flutter 特定的功能。#Android Studio 未在 /path/to/android/studio 找到
- azure - Peek 消息不会返回所有消息
- java - Spring JPA HQL 枚举“in 子句”查询
- javascript - 等待所有 dom 更新完成
- python-3.x - 使用openpyxl检查它是否是工作簿的第一张最简单的方法是什么
- reactjs - React antd 4 Form in Modal resetFields 显示错误数据
- php - 带有 laravel 的 Paypal PHP SDK。在生产模式下加载配置端点时出现问题
- grafana - 存储聚合没有像我期望的那样组合
- arrays - 作为参数传递给函数的数组长度