EDITAR: reformularía la pregunta: ¿es posible usar la declaración de cambio de esta manera? Parece que, por un lado, está permitido tener tipos como casos que pueden simplificar la apariencia del código, pero luego, si desea lograr la reutilización al fallar usando la declaración go to, entonces esto no es posible. Tal como está actualmente, estoy más interesado en la construcción del lenguaje que en resolver el problema que puedo resolver repitiendo algún código o pasando a las declaraciones if else. Sé que goto es malo en general, pero parece que es al menos aceptable como una forma de simular el mecanismo fallido en C sin ser propenso a errores usando/omitiendo break ; por error
Me gustaría usar la declaración de switch junto con el cambio de tipos, pero quiero usar el método fall-trough usando goto
Me gustaría realizar diferentes acciones dependiendo del tipo de elemento en la lista: pero obtengo un error: Use of unassigned local variable 'animal1' ¿Puedo hacerlo usando el interruptor en el tipo de objeto o necesito comparar cadenas o usar si -otros constructos?
using System; using System.Collections.Generic; namespace switch_type_experiments { public class Animal { public void Eat() { } } public class Mammal : Animal { public void DoMammalStuff() { } } public class Dog : Mammal { public void Bark() { } } class Program { static void Main(string[] args) { List<Animal> listOfAnimals = new(); foreach (Animal animal in listOfAnimals) { switch (animal) { case Dog animal1: //do stuff only applicable for dog such as accessing // available only for dogs animal1.Bark(); goto MammalLabel; case Mammal animal1: MammalLabel: //do Mammal stuff animal1.DoMammalStuff(); goto AnimalLabel; case Animal animal1: AnimalLabel: animal1.Eat(); //do Animal stuff break; default: break; } } } } }Si mi entendimiento es correcto, entonces puede lograr lo mismo con solo 3 líneas de código en lugar de las declaraciones switch y goto :
foreach (Animal animal in listOfAnimals) { if (animal is Dog dog) dog.Bark(); if (animal is Mammal mammal) mammal.DoMammalStuff(); animal.Eat(); } ACTUALIZACIÓN # 1 : Usar declaración de switch
En C# puede llamar a break , return , continue , throw o goto para controlar la falla.
goto tiene una versión realmente especial en la que puede saltar a un case x en lugar de una label x predefinida. Pero hay una advertencia: la x debe ser una constante de tiempo de compilación.
Entonces, si se limita a usar la declaración de switch , puede hacer una de las siguientes cosas:
int type = animal switch { Dog dog => 3, Mammal mammal => 2, _ => 1 }; switch (type) { case 3: (animal as Dog).Bark(); goto case 2; case 2: (animal as Mammal).DoMammalStuff(); goto case 1; case 1: animal.Eat(); break; }O
ImmutableDictionary<Type, int> mapping = new Dictionary<Type, int> { { typeof(Dog), 3 }, { typeof(Mammal), 2 } }.ToImmutableDictionary(); int type = mapping.TryGetValue(animal.GetType(), out type) ? type : 1; switch (type) { case 3: (animal as Dog).Bark(); goto case 2; case 2: (animal as Mammal).DoMammalStuff(); goto case 1; case 1: animal.Eat(); break; }