Estoy usando un class como un enum porque mis entradas necesitan una representación de cadena personalizada:

using System.Collections.Generic;

namespace MyProject
{
    internal class Food
    {
        private string _value = "";

        private Food(string value)
        {
            _value = value;
        }

        public override string ToString()
        {
            return _value;
        }

        internal static Food RedApple = new Food("red_apple");
        internal static Food YellowBanana = new Food("yellow_banana");
        internal static Food GreenMango = new Food("green_mango");
    }
}

Puedo usar los campos static como Food.RedApple muy bien:

if (str == Food.RedApple.ToString())
    Console.WriteLine("apple");
else if (str == Food.YellowBanana.ToString())
    Console.WriteLine("banana");
else if (str == Food.GreenMango.ToString())
    Console.WriteLine("mango");
else
    Console.WriteLine("unknown");

Sin embargo, cuando los uso dentro de switch declaraciones así:

using System;

namespace MyProject
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "red_apple";

            switch (str)
            {
                case Food.RedApple.ToString():
                    Console.WriteLine("apple");
                    break;
                case Food.YellowBanana.ToString():
                    Console.WriteLine("banana");
                    break;
                case Food.GreenMango.ToString():
                    Console.WriteLine("mango");
                    break;
                default:
                    Console.WriteLine("unknown");
                    break;
            }
        }
    }
}

Aparece el siguiente error:

El nombre de tipo RedApple no existe en el tipo Food [MyProject]

¿Qué está pasando exactamente aquí, y esto significa que no puedo usar mi clase dentro de las declaraciones switch?

1
Floating Sunfish 17 feb. 2020 a las 10:10

2 respuestas

La mejor respuesta

Comenzó con la declaración de cambio de c # 7.0 se ha vuelto más poderosa y cubre muchos escenarios.

Pero para responder a su pregunta de la manera más breve, debe poner un valor constante en su campo de caso. Puede intentar colocar una variable u otra propiedad de cadena de Food dentro de la instrucción switch, pero tampoco funcionará porque el switch está buscando un valor constante.

Puede consultar el documentos de Microsoft en declaración de cambio.

1
SZT 17 feb. 2020 a las 07:49

No estoy seguro de cuál es exactamente su caso, pero en mi caso (usando su código), obtengo 'CS0150 Se espera un valor constante'. Mensaje de error aquí.

El problema se ha respondido aquí: Cambiar caso en C # - se espera un valor constante

Puede echarle un vistazo primero, puede ser de alguna ayuda.

1
Tu-Jen Liang 17 feb. 2020 a las 07:58