una todavía superar separación separacion ruptura reponerse relacion psicologia noviazgo mujeres muchos larga dolor cuando como años amorosa ama c# switch-statement break yield-return

c# - separacion - como superar una separación cuando todavía se ama



¿Por qué se requiere una ruptura después del rendimiento en una declaración de cambio? (3)

¿Alguien puede decirme por qué el compilador piensa que la break es necesaria después del yield return en el siguiente código?

foreach (DesignerNode node in nodeProvider.GetNodes(span, node => node.NodeType != NDjango.Interfaces.NodeType.ParsingContext)) { switch (node.ErrorMessage.Severity) { case -1: case 0: continue; case 1: yield return new TagSpan<ErrorTag>(node.SnapshotSpan, new ErrorTag(PredefinedErrorTypeNames.Warning)); break; default: yield return new TagSpan<ErrorTag>(node.SnapshotSpan, new ErrorTag(PredefinedErrorTypeNames.SyntaxError)); break; } }


¿Por qué es necesaria la ruptura después del rendimiento de retorno en una sentencia de cambio?

La pregunta supone una premisa incorrecta. No se requiere una declaración de interrupción después de un rendimiento de rendimiento en una instrucción de cambio. Por ejemplo:

switch(x) { case 123: yield return 456; M(); throw new Exception(); case 789: // and so on

Aquí tenemos un rendimiento en una declaración de cambio que no es seguida por una ruptura. Le sigue una llamada a M () y luego una declaración de lanzamiento. Eso es perfectamente legal.

La regla real es que el punto final de una sección de interruptor no debe ser alcanzable .

No se puede acceder a los puntos finales de una ruptura, continuar, regresar, ir, volver y lanzar porque todas esas declaraciones se ramifican a otra ubicación y no regresan, por lo que no es posible acceder al token de código que las sigue. Esto contrasta con, por ejemplo, una llamada de método, que se ramifica a otra ubicación y luego regresa, o un rendimiento, que transfiere el control al llamante; cuando la persona que llama transfiere el control al bloque iterador, el control retomará donde quedó el rendimiento, por lo que se puede alcanzar el punto final del rendimiento.

Si este tema le interesa, recomiendo leer la sección 8.1 de la especificación.


Debido a que el rendimiento es solo azúcar sintáctica para un generador de iteradores, y en realidad no está saliendo de ningún método. Y C # no permite fallos en las declaraciones de switch (y no parece que lo quieras aquí de todos modos).


Un retorno "normal" tiene dos funciones:

  1. Marque el valor de retorno de la función.
  2. Transferir el control a la persona que llama.

Un retorno de campo solo marca un valor de retorno; No afecta el flujo de control. Después de una declaración de rendimiento, la ejecución del programa continúa en la siguiente línea, donde se necesita un descanso en su muestra, al igual que en cualquier otra declaración de cambio de caso.