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

时间:2011-04-11 18:39:44

标签: c# .net enums

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

2 个答案:

答案 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;
     } 

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