如果左操作数到?? operator不为null,是否对右操作数进行求值?

时间:2014-09-24 18:52:37

标签: c# .net operators

我正在考虑在C#中使用??运算符(null-coalescing运算符)。但是MSDN上的documentation是有限的。

我的问题:如果左侧操作数不为空,是否会对右侧操作数进行评估?

4 个答案:

答案 0 :(得分:29)

与以往一样,C#规范是最适合此类事情的地方。

C# 5 specification的第7.13节(强调我的):

  

a ?? b形式的空合并表达式要求a具有可空类型或引用类型。如果a为非空,则a ?? b的结果为a;否则,结果为b仅当b为空时,操作才会评估a

有关执行任何转换的详细信息以及确切的行为,但这是给出问题的主要观点。值得注意的是,空合并运算符是右关联的,因此a ?? b ?? c被评估为a ?? (b ?? c) ...这意味着它只会评估c如果两者 ab为空。

答案 1 :(得分:11)

为什么不测试它:))

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 ......第二个值没有得到评估

答案 2 :(得分:4)

来自规范:

  

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

(强调补充)

答案 3 :(得分:2)

检查一下。如果name不为null,则控制台显示“MyName”。如果它为null,则控制台显示“Called”,然后显示“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";
    }
}