2016-04-15 74 views
0

我有从文章下面的代码,我挺不理解他们关于使用空运营商的差异:空,操作混乱

if (memberAccessExpr?.Name.ToString() != "Match") return; 

这一次我很清楚我猜测,检查memberAccessExpr为空,如果它为空,与“匹配”的比较返回false,是否正确?

混乱配备了第二个:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return; 

这行代码在我看来,几乎是一样的第一,因为我做一个简单的空检查,然后调用,它返回一个函数布尔值(!=StartsWith)...那么为什么我需要一个额外的?? - 运算符在这里,而不是在第一行?也许这与隐含的== true比较有关,它会在没有??运算符的情况下发生?

我不知道,也许你们可以赐教:)

干杯, 迈克尔

回答

2

空传播运算符返回null如果左侧部分是null,或右部分,如果它是不。如果右边部分返回值类型,它将转换为Nullable<T> ...所以如果右边部分返回bool,如果有?.它将返回Nullable<bool>(或bool?)。

所以对于第一:

if (memberAccessExpr?.Name.ToString() != "Match") return; 

手段大致(详细故意):

string comparer; 

if(memberAccessExpr == null) 
    comparer = null; 
else 
    comparer = memberAccessExpr.Name.ToString(); 

if(comparer != "Match") return; 

对于第二个:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return; 

方式大致有:

bool? comparer; 

if (memberSymbol == null) 
    comparer = null; 
else 
    comparer = memberSymbol.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match"); 

if(comparer ?? true) return; 

如果最后一行迷惑大家,??操作粗略的意思是:“如果左边部分为null,返回的权利的一部分,否则返回左部”

+0

还好现在我明白了,因为在第二行表达的是一个可空bool..confusing stuff..but感谢好的答案:) –

+0

它成为一个为空的布尔值,因为你正在使用''。''运算符,因此它需要能够同时保存'null'值和右边表达式(它是'bool')的结果,因此'bool?'。请注意,代码不是编译器所做的,这就是我写给你解释 – Jcl

+0

所以基本上,如果一个对象调用什么东西?返回简单类型的运算符,我可以检查结果吗?运算符,因为它成为可空类型,对吧? –

0

您对???

的一些快捷操作员?. Operator MSDN Documentation

int? length = customers?.Length; // null if customers is null 
Customer first = customers?[0]; // null if customers is null 
int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null 

?? Operator MSDN Documentation

// Assign i to return value of the method if the method's result 
// is NOT null; otherwise, if the result is null, set i to the 
// default value of int. 
int i = GetNullableInt() ?? default(int); 

?: Operator MSDN Documentation

// if-else construction. 
if (input > 0) 
    classify = "positive"; 
else 
    classify = "negative"; 

// ?: conditional operator. 
classify = (input > 0) ? "positive" : "negative";