unario - Tratando de entender ?. operador(nulo-condicional) en C#
operadores de asignacion en c# (2)
En su primer caso (
list?.Count
), el operador devuelve un
int?
- un
int
.
El operador
>
se define para enteros anulables de modo que si el
int?
no tiene valor (es nulo), la comparación devolverá
false
.
En su segundo ejemplo (
a?.B
) un
bool?
se devuelve (porque si
a
es nulo, no se devuelve ni
true
ni
false
sino
null
).
Y
bool?
no se puede usar en una instrucción
if
ya que la instrucción
if
requiere un
bool
(no anulable).
Puede cambiar esa declaración a:
if (a?.B ?? false)
para que funcione de nuevo.
Entonces, el operador de fusión nula (
??
) devuelve
false
cuando el operador condicional nulo (
?.
) Devuelve
null
.
O (como sugirió TheLethalCoder):
if (a?.B == true)
Tengo este ejemplo muy simple:
class Program
{
class A
{
public bool B;
}
static void Main()
{
System.Collections.ArrayList list = null;
if (list?.Count > 0)
{
System.Console.WriteLine("Contains elements");
}
A a = null;
if (a?.B)
{
System.Console.WriteLine("Is initialized");
}
}
}
La línea
if (list?.Count > 0)
compila perfectamente, lo que significa que si
list
es
null
, la expresión
Count > 0
vuelve
false
por defecto.
Sin embargo, la línea
if (a?.B)
arroja un error de compilación que dice que no puedo convertir
bool?
implícitamente
bool?
bool
¿Por qué uno es diferente del otro?
-
list?.Count > 0
: Aquí comparas unint?
a unint
, produciendo unbool
, ya que los operadores de comparación levantados devuelven unbool
, no unbool?
. -
a?.B
: Aquí, ¿tienes unbool?
.if
, sin embargo, requiere unbool
.