Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

120
Views
Usar goto para fallar en el interruptor cuando también se enciende el tipo en C #

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; } } } } }
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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; }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!