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