uso switch sentencia resueltos ejercicios ejemplos ejemplo consola c# if-statement switch-statement

c# - sentencia - ¿Por qué una instrucción if funciona pero no una instrucción switch?



switch en c# ejercicios (4)

Esto realmente no es una buena respuesta, ya que solo sirve como explicación de las respuestas anteriores. No lo acepte (por favor, no vote por encima de cualquier respuesta razonable). Lo escribo como respuesta solo porque un comentario no se ajusta a esta explicación.

Intentaste:

switch (msgComingFromFoo[1]) { case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()): break; }

Esto no funciona ya que el caso no es constante. Como se sugirió, la mejor manera de avanzar es convertir la msgComingFromFoo[1] nuevamente en un valor de enumeración para que pueda cambiar la enumeración y usar las constantes de enumeración en los casos de cambio.

Si de alguna manera no es posible, siempre puede cambiar las constantes de cadena. Sin embargo, esto es propenso a errores y anula el propósito de usar enumeraciones en primer lugar.

switch (msgComingFromFoo[1]) { case "A": break; }

Otra observación: recuerde que las matrices están indexadas a cero . Actualmente estás cambiando el segundo elemento, no el primero. Use msgComingFromFoo[0] para el primer elemento.

Estoy tratando de crear una declaración de switch utilizando el índice de caracteres de una cadena y un Enum usando this contenedor para obtener el valor del enum seleccionado de una Descripción. Prácticamente le permite almacenar una cadena a un valor de enumeración.

Aquí está mi declaración if :

if (msgComingFromFoo[1] == Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString())) { //foo }

y aquí está mi declaración de switch :

switch (msgComingFromFoo[1]) { case Convert.ToChar(Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString()): break; }

¿Por qué acepta la instrucción if y no el switch ? Intenté convertirlo en un char ya que seleccioné un índice de una cadena, pero desafortunadamente no funcionó.

Actualizar:

Aquí está el Message.Code Enum

public class Message { public enum Code { [Description("A")] FOO_TRIGGER_SIGNAL } }

Como puede ver, necesito la Descripción asignada a la enumeración, no el valor de enumeración que es 0. El uso de Message.Code.FOO_TRIGGER_SIGNAL.EnumDescriptionToString() de la envoltura mencionada devuelve A no 0


Error:

Se espera un valor constante


No puede tener expresiones en el caso (antes de C # 7), pero puede hacerlo en el cambio, por lo que esto funcionará:

switch (ConvertToMessageCode(msgComingFromFoo[1])) { case Message.Code.FOO_TRIGGER_SIGNAL: break; }

Donde necesitará escribir ConvertToMessageCode para hacer la conversión necesaria a la enumeración de Message.Code . ConvertToMessageCode simplemente abstrae los detalles de la conversión, es posible que no necesite un método separado, pero que pueda conformarse con el código en línea en la declaración de cambio, por ejemplo, una conversión.


Para agregar a la respuesta de @ code-apprentice.

Si encuentra que la instrucción if está volviendo demasiado larga o tiene múltiples condiciones dentro de la de if else . Puede mirar la refactorización del código y encapsular su lógica en un objeto y usar el patrón de visitante para controlar el trabajo que debe realizarse.

Algo como:

public interface IMessageLogic { void ProcessMessage() } public class TriggerSignal : IMessageLogic { public void ProcessMessage() { // Do trigger stuff } } public class FooMessage : IMessageLogic { public void ProcessMessage() { // Do foo stuff } } public class MessageHandler { public void HandleMessage(IMessageLogic messageLogic) { messageLogic.ProcessMessage(); } } public static void Main() { IMessageLogic messageLogic = GetMessage(); var handler = new MessageHandler(); handler.HandleMessage(messageLogic); }

Patrón de visitante


Un case en una sentencia de switch debe referirse a un valor constante. No se puede evaluar una expresión en un case .