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

Pau*_*sik 7 .net c# 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

它很容易修复,只是强制转换为字节,但是如果为枚举指定了基础类型,为什么还要强制转换?如果必须要进行转换,指定基础类型有什么意义?

如果我演员,一切正常.例:

        byte switchByte = (byte)CmdlnFlags.ValB;
        switch (switchByte) {
            case (byte)CmdlnFlags.ValA: Console.WriteLine('A'); break;
            case (byte)CmdlnFlags.ValB: Console.WriteLine('B'); break;
        }
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 4

你必须进行投射以确保这确实是你想要做的。这是一个类型安全功能。

您应该将枚举视为与其基础类型以及具有相同基础类型的其他枚举不同的类型。它们非常不同,如果您想将其中一个用作另一个,则需要进行转换。

有时可能会很痛苦,但最终这是一件好事。

无论如何,你为什么要在切换之前进行投射?只需打开实际的枚举值:

CmdlnFlags switchFlag = CmdlnFlags.ValB;
switch (switchFlag) {
    case CmdlnFlags.ValA: Console.WriteLine('A'); break;
    case CmdlnFlags.ValB: Console.WriteLine('B'); break;
}
Run Code Online (Sandbox Code Playgroud)

在这里,您实际上并不希望将标志视为字节 - 您希望将其视为标志并打开它。所以这正是你应该做的。