Tratando de entender. operador (null-condicional) en C#
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
se convierte en false
por defecto.
Sin embargo, la línea if (a?.B)
lanza un error de compilador diciendo que no puedo convertir implícitamente bool?
a bool
.
¿Por qué uno es diferente del otro?
2 answers
-
list?.Count > 0
: Aquí se compara unint?
con 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
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:15
En su primer caso (list?.Count
) el operador devuelve un int?
- a nullable int
.
El operador >
se define para enteros nullables de modo que si el int?
no tiene valor (es nulo), la comparación devolverá false
.
En tu segundo ejemplo (a?.B
) se devuelve un bool?
(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 una bool
(no anulable).
Puedes cambiar esa declaración a:
if (a?.B ?? false)
Para hacer que funcione de nuevo. Así que el operador coalescente nulo (??
) devuelve false
cuando el operador condicional nulo (?.
) devuelve null
.
O (como sugirió TheLethalCoder):
if (a?.B == true)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 15:38:44