Невозможно неявно преобразовать значение из enum, даже если указан базовый тип - PullRequest
7 голосов
/ 11 апреля 2011

В следующем примере кода я определяю перечисление и определяю его базовый тип как байт.Затем я пытаюсь присвоить байтовое значение и включить значения перечисления, но получаю ошибку: 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 ]

4 голосов
/ 11 апреля 2011

Вы должны сыграть, чтобы убедиться, что это действительно то, что вы хотите сделать. Это функция безопасности типа.

Вы должны думать, что перечисление отличается от его базового типа - и от других перечислений с тем же базовым типом. Они достаточно разные, поэтому, если вы хотите использовать одного как другого, вам нужно разыграть.

Иногда это может быть болью, но в конечном итоге это хорошо.

Почему вы все равно кастуетесь перед выключателем? Просто включите фактические значения перечисления:

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

Здесь вы не действительно хотите трактовать флаг как байт - вы хотите трактовать его как флаг и включать его. Так что это именно то, что вы должны сделать.

1 голос
/ 11 апреля 2011

В большинстве случаев такие приведения не нужны.Вместо того, чтобы использовать переменную типа byte для управления переключателем, просто создайте переменную типа CmdlnFlags.

    CmdlnFlags switchValue = CmdlnFlags.ValB;
    switch (switchValue) {
         case CmdlnFlags.ValA: Console.WriteLine('A'); break;
         case CmdlnFlags.ValB: Console.WriteLine('B'); break;
     } 

. Приведения необходимы для правильного проектирования программы.Обычно вы не хотите использовать перечисление в качестве числового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...