2014-09-24 26 views

回答

27

与以往一样,在C#规范去为这种事情的最佳场所。

C# 5 specification(重点煤矿)第7.13:

空聚结形式的a ?? b表达式需要a是一个空类型或引用类型。如果a非空,则a ?? b的结果为a;否则,结果是b仅当a为空时,操作才会评估b

有关执行任何转换时的详细信息以及确切的行为,但这是您提出问题的要点。值得注意的是,空合并运算符是右联合的,所以a ?? b ?? c被评估为a ?? (b ?? c) ...这意味着它将仅评估c如果ab为空。

+0

谢谢从来没有想过检查规范 – 2014-09-24 19:04:22

+9

@AararrByrd:*总是*检查规范:) C#规范是最好的书面之一我'已经见过,而且它是这类事情的权威来源。 – 2014-09-24 19:22:01

+0

这个操作符的关联性是否对其行为有实际影响?我试图想一个案例,其中'(a ?? b)?? c'会表现不同于'a? (b ?? c)',我想不出一个。 – JLRishe 2016-05-17 13:13:42

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

检查了这一点。如果名称不为空,则控制台显示“MyName”。如果它是零,控制台显示“调用”,然后“异体”

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

从规范:

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

(强调)

相关问题