【发布时间】: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<Enum>(...)--Enum约束允许T成为Enum本身:添加struct强制T成为特定类型枚举。
标签: c# generics enums generic-method