作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在下面的代码示例中,我定义了一个枚举并将其基础类型指定为字节。然后,我尝试分配一个字节值并打开枚举值,但出现错误:Cannot implicitly convert type 'CmdlnFlags' to 'byte'。存在显式转换(是否缺少强制转换?)
代码:
using System;
public enum CmdlnFlags: byte {
ValA = (byte)'a',
ValB = (byte)'b',
}
public class Sample {
public static void Main() {
byte switchByte = CmdlnFlags.ValB;
switch (switchByte) {
case CmdlnFlags.ValA: Console.WriteLine('A'); break;
case CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
Console.ReadKey();
}
}
修复起来很容易,只需转换为字节即可,但如果为枚举指定了基础类型,为什么还要进行转换?如果无论如何都必须进行强制转换,那么指定基础类型有什么意义?
如果我转换,一切正常。示例:
byte switchByte = (byte)CmdlnFlags.ValB;
switch (switchByte) {
case (byte)CmdlnFlags.ValA: Console.WriteLine('A'); break;
case (byte)CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
最佳答案
您必须进行转换以确保这确实是您想要做的。这是一种类型安全功能。
您应该将枚举视为与其底层类型以及具有相同底层类型的其他枚举不同的类型。它们完全不同,如果您想将一个用作另一个,则需要进行转换。
这有时会很痛苦,但最终却是一件好事。
尽管如此,你为什么要在切换之前施法?只需打开实际的枚举值:
CmdlnFlags switchFlag = CmdlnFlags.ValB;
switch (switchFlag) {
case CmdlnFlags.ValA: Console.WriteLine('A'); break;
case CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
在这里,您真的不想将标志视为字节 - 您想要将其视为标志并打开它。所以这正是您应该做的。
关于c# - 即使指定了基础类型,也无法从枚举隐式转换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5625873/
我是一名优秀的程序员,十分优秀!