2016-04-15 73 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";