即使指定了基础类型,也无法从枚举中隐式转换值

在下面的代码示例中,我定义了一个枚举,并将其基础类型指定为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; } 

演员必须鼓励正确的节目设计。 您通常不希望将枚举用作数值。