在下面的代码示例中,我定义了一个枚举,并将其底层类型指定为byte。然后我尝试分配一个字节值并打开枚举值,但是我收到一个错误:Cannot implicitly convert type 'CmdlnFlags' to 'byte'. An explicit conversion exists (are you missing a cast?)
代码:
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;
}
答案 0 :(得分:4)
你必须施展,以确保你真正的意思。这是一种类型安全功能。
您应该将枚举视为与其基础类型不同的类型 - 以及具有相同基础类型的其他枚举。它们是完全不同的,如果你想使用另一个,你需要施放。
偶尔会有痛苦,但最终还是一件好事。
为什么你还要在开关前施放?只需打开实际的枚举值:
CmdlnFlags switchFlag = CmdlnFlags.ValB;
switch (switchFlag) {
case CmdlnFlags.ValA: Console.WriteLine('A'); break;
case CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
在这里,你没有真的希望将标志视为一个字节 - 你想把它当作一个标志并将其打开。所以这正是你应该做的。
答案 1 :(得分:1)
在大多数情况下,这种演员阵容是不必要的。而不是使用类型byte
的变量来控制开关,只需创建一个CmdlnFlags
类型的变量。
CmdlnFlags switchValue = CmdlnFlags.ValB;
switch (switchValue) {
case CmdlnFlags.ValA: Console.WriteLine('A'); break;
case CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
演员必须鼓励正确的节目设计。您通常不希望将枚举用作数值。