ternario operador condicional c# .net operators

condicional - operador c#



Si el operando a la izquierda ?? el operador no es nulo, ¿se evalúa el operando correcto? (4)

¿Por qué no probarlo :)

void Main() { var leftOrRight = left ?? right; } public bool? left { get { Console.WriteLine ("Left hit"); return true; } } public bool right { get { Console.WriteLine ("Right hit"); return true; } }

Y la respuesta a la pregunta es no ... El segundo valor no se evalúa

Estoy mirando a usar el ?? operador (operador de unión nula) en C #. Pero la documentation en MSDN es limitada.

Mi pregunta: si el operando de la izquierda no es nulo, ¿se evalúa el operando de la derecha?


Como siempre, la especificación de C # es el mejor lugar para este tipo de cosas.

De la sección 7.13 de la especificación C # 5 (énfasis mío):

Una expresión nula coalescente de la forma a ?? b a ?? b requiere que sea de tipo anulable o tipo de referencia. Si a no es nulo, el resultado de a ?? b a ?? b es a De lo contrario, el resultado es b . La operación evalúa b solo si a es nulo.

Hay más detalles sobre cuándo se realizan las conversiones y el comportamiento exacto, pero ese es el punto principal dado su pregunta. También vale la pena señalar que el operador de unión nula es asociativo por derecho, por lo que a ?? b ?? c a ?? b ?? c a ?? b ?? c se evalúa como a ?? (b ?? c) a ?? (b ?? c) ... lo que significa que solo evaluará c si a y b son nulos.


De la especificación:

Una expresión nula coalescente de la forma a ?? b requiere que sea de tipo anulable o tipo de referencia. Si a no es nulo, el resultado de un ?? b es un De lo contrario, el resultado es b. La operación evalúa b solo si a es nulo.

(Énfasis añadido)


Mira esto. Si el nombre no es nulo, la consola muestra "MyName". Si es nulo, la consola muestra "Llamado" y luego "Allo"

using System; public class Program { public static void Main() { string name = "MyName"; Console.WriteLine(name??test()); } private static string test() { Console.WriteLine("Called"); return "Allo"; } }