如果左操作数为 ??运算符不为 null,是否计算正确的操作数

本文关键字:操作数 计算 是否 运算符 如果 null | 更新日期: 2023-09-27 18:24:11

我正在考虑在 C# 中使用 ?? 运算符(空合并运算符(。但是MSDN的文档是有限的。

我的问题:如果左操作数不为空,右手操作数是否会被评估?

如果左操作数为 ??运算符不为 null,是否计算正确的操作数

与以往一样,C# 规范是处理此类事情的最佳选择。

来自 C# 5 规范的第 7.13 节(强调我的(:

形式 a ?? b 的 null 合并表达式要求a为可为 null 的类型或引用类型。如果a为非空,则a ?? b的结果为 a ;否则,结果为 b仅当 a 为 null 时,该操作才计算b

关于何时执行任何转换以及确切的行为,还有更多详细信息,但这是您问题的要点。还值得注意的是,零合并运算符是右关联的,因此a ?? b ?? c被评估为 a ?? (b ?? c) ...这意味着它只会在ab为 null 时计算c

为什么不测试它:)

void Main()
{
    var leftOrRight = left ?? right;
}
public bool? left 
{
    get
    {
        Console.WriteLine ("Left hit");
        return true;
    }
}
public bool right 
{
    get
    {
        Console.WriteLine ("Right hit");
        return true;
    }   
}

问题的答案是no...第二个值未被计算

从规范:

形式为 a ?

? b 的空合并表达式要求 a 为可为空的类型或引用类型。如果 a 为非空,则 ??b 是 a;否则,结果为 b。仅当 a 为 null 时,该操作才计算 b。

(着重号后加(

看看这个。如果名称不为空,控制台将显示"我的姓名"。如果为 null,则控制台显示"已调用",然后显示"Allo"

using System;           
public class Program
{
    public static void Main()
    {
        string name = "MyName";
        Console.WriteLine(name??test());
    }
    private static string test()
    {
        Console.WriteLine("Called");
        return "Allo";
    }
}