Primero que nada, deberías repasar los fundamentos, porque te estás complicando mucho con cosas más bien triviales, además de que la sugerencia de quitar el bucle era tan disparatada, y tan obvio lo que iba a suceder, que no sé cómo se te ocurrió siquiera probarla.
En cuanto al problema, en general, si tienes una secuencia de llamadas de funciones tipo:
A --> B --> C --> D
deberías intentar evitar que cualquiera de esas funciones llame a alguna de las anteriores (B no debería llamar a A, C no debería llamar ni a A ni a B, etc.). Si por ejemplo, estando en D, quieres volver al submenú anterior (C), la solución NO es llamar a C, sino simplemente dejar que D termine su ejecución, retornando de forma normal.
Muy bueno, si Señor.
Si también quieres que, por ejemplo, desde D o C sea posible volver al menú inicial (A), lo único que cambia es que estas funciones deberían devolver un valor que indique que se seleccionó la opción del menú principal. Suponiendo que sea un bool, lo que harías sería que cuando desde una función se desea volver al inicio, ésta termine con un return true (y en todos los demás casos, retornar false). Asimismo, todas las funciones, al invocar a otra, deberán verificar el valor que retorne, y si es true, deberán terminar su ejecución, devolviendo a su vez true, es decir, este valor se propaga a lo largo de la secuencia de llamadas, lo cual hará que termines volviendo al menú inicial de forma limpia.
Eso intentaba desde el principio, que vuelva de forma limpia, de cualquier proceso. Con los GOTO, que está muy mal visto por ser propenso a tener malas prácticas de programación, como no usa pila, solo etiquetas, iba hacer pruebas.
Hay más opciones de saltos según aquí.
https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/statements/jump-statements
Para que todo esto funcione, tienes que cambiar tus funciones de manera que los menús se impriman dentro de los bucles.
En cuanto al problema, en general, si tienes una secuencia de llamadas de funciones tipo:
A --> B --> C --> D
deberías intentar evitar que cualquiera de esas funciones llame a alguna de las anteriores (B no debería llamar a A, C no debería llamar ni a A ni a B, etc.). Si por ejemplo, estando en D, quieres volver al submenú anterior (C), la solución NO es llamar a C, sino simplemente dejar que D termine su ejecución, retornando de forma normal.
Muy bueno, si Señor.
Si también quieres que, por ejemplo, desde D o C sea posible volver al menú inicial (A), lo único que cambia es que estas funciones deberían devolver un valor que indique que se seleccionó la opción del menú principal. Suponiendo que sea un bool, lo que harías sería que cuando desde una función se desea volver al inicio, ésta termine con un return true (y en todos los demás casos, retornar false). Asimismo, todas las funciones, al invocar a otra, deberán verificar el valor que retorne, y si es true, deberán terminar su ejecución, devolviendo a su vez true, es decir, este valor se propaga a lo largo de la secuencia de llamadas, lo cual hará que termines volviendo al menú inicial de forma limpia.
Eso intentaba desde el principio, que vuelva de forma limpia, de cualquier proceso. Con los GOTO, que está muy mal visto por ser propenso a tener malas prácticas de programación, como no usa pila, solo etiquetas, iba hacer pruebas.
Hay más opciones de saltos según aquí.
https://learn.microsoft.com/es-es/dotnet/csharp/language-reference/statements/jump-statements
Para que todo esto funcione, tienes que cambiar tus funciones de manera que los menús se impriman dentro de los bucles.
Sigo cogiendo ideas. Me da igual empezar desde cero el programa aunque sea largo.
En cuanto a tu ejemplo del:
A --> B --> C --> D
Pues si, me interesa estar en B, luego paso limpiamente a D, luego a A, luego a D otra vez, todo limpio, de eso se trata, ya que estoy trabajando como si fueran un Form llama a otro Form del que me de la gana dentro de un programa de Windows Form, que en este caso no hay problemas, en modo consola si hay si te despistas.
En cuanto al return, me imagino que te refieres que justo antes que acabe un void o función, tenga return true; o el return false;
Muchas gracias a todos por las aclaraciones.