试着去理解? C#中的(null-conditional)运算符

时间:2016-06-29 15:27:22

标签: c# nullable roslyn c#-6.0 null-conditional-operator

我有一个非常简单的例子:

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");
        }
    }
}

if (list?.Count > 0)行完美编译,这意味着如果listnull,则Count > 0表达式默认为false

但是,行if (a?.B)会抛出编译错误,说我无法将bool?隐式转换为bool

为什么一个人与另一个人不同?

2 个答案:

答案 0 :(得分:74)

答案 1 :(得分:38)

在您的第一个案例(list?.Count)中,运营商会返回int? - 可以为空的int>运算符是为可空整数定义的,因此如果int?没有值(为空),则比较将返回false

在您的第二个示例(a?.B)中,会返回bool?(因为如果a为空,则truefalse都不会null }返回)。并且bool?无法在if语句中使用,if语句需要(不可为空)bool

您可以将该语句更改为:

if (a?.B ?? false)

让它再次运作。因此,当空条件运算符(??)返回false时,null-coalescing运算符(?.)返回null

或(正如TheLethalCoder建议的那样):

if (a?.B == true)