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 ?? ba ?? brequiere que sea de tipo anulable o tipo de referencia. Siano es nulo, el resultado dea ?? ba ?? besaDe lo contrario, el resultado esb. La operación evalúabsolo siaes 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";
}
}