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?

Author: DavidRR, 2016-06-29

2 answers

  • list?.Count > 0: Aquí se compara un int? con un int, produciendo un bool, ya que los operadores de comparación levantados devuelven un bool, no un bool?.
  • a?.B: Aquí, tienes un bool?. if, sin embargo, requiere un bool.
 73
Author: Heinzi,
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)
 37
Author: René Vogt,
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