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. Sia
no es nulo, el resultado dea ?? b
a ?? b
esa
De lo contrario, el resultado esb
. La operación evalúab
solo sia
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";
}
}