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

Dee*_*ena 62 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

但是,该行if (a?.B)抛出编译器错误,表示我无法隐式转换bool?bool.

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

Hei*_*nzi 75

  • 谢谢.我没有意识到`list?.Count`基本上变成`int?tmp = list?.Count`然后当然`tmp> 0`的计算结果为false.这是缺失的一块. (7认同)

Ren*_*ogt 38

在你的第一个case(list?.Count)中,运算符返回int?一个可空的int.
>经营者可为空整数定义,因此,如果int?没有值(为空),比较会返回false.

在你的第二个例子中,(a?.B)bool?返回一个(因为如果a为null,既不是true也不是,false而是null返回).并且bool?不能在if语句中使用,因为if语句需要(不可为空)bool.

您可以将该语句更改为:

if (a?.B ?? false)
Run Code Online (Sandbox Code Playgroud)

让它再次运作.因此,当??返回falsenull条件operator(?.)时,null-coalescing operator()返回null.

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

if (a?.B == true)
Run Code Online (Sandbox Code Playgroud)

  • @TheLethalCoder虽然C#将`bool`值限制为`false`和`true`,但.NET Framework却没有,而非C#方法可能会为你提供伪C#中可以作为`(bool)2`的内容.如果用作条件,这样的值足以输入"if"块,但不能比较等于"true". (4认同)
  • `if(a?.B == true)`会给出相同的效果吗? (3认同)
  • 无论 `if (a?.B == true)` 是否有效,当我看到它时,我的直觉告诉我“不要将布尔值与真(或假)进行比较,直接使用它们”,就像将当有人写 `if (someCondition == true)` 而不是 `if (someCondition)` 时,通常是合适的。我不确定如何构建一个最终鼓励`(... == true)`的结构。 (2认同)
  • @RenéVogt是的,我明白了; 我的观点是,看到一个'== true`**是正确的地方真是太不可思议了. (2认同)