2017-08-09 199 views
-1

爲什麼此代碼的工作:空,條件運算符和if語句

if (list?.Any() == true) 

但是這個代碼不:

if (list?.Any()) 

錯誤CS0266無法隱式轉換類型'布爾? 'bool'

那麼,爲什麼它不是一個語言功能,如果聲明在中做出這樣的隱式轉換?

+2

你是說爲什麼不'if'聲明接受'布爾?'條件?對我而言,如果結果爲空,您覺得它很模糊不清。您默認爲虛假(有效),但在其他情況下,您希望默認爲true。 –

+0

'list?.Any()'如果列表爲null,則可能爲null。鑑於任何返回布爾它有可能返回一個布爾值。因此在編譯時爲空的布爾值 – Nkosi

+0

但除此之外,除非Mads或C#設計團隊中的其他人員回答,否則基本上會得到猜測。 –

回答

1

if聲明將評估Boolean表達式。

bool someBoolean = true; 

if (someBoolean) 
{ 
    // Do stuff. 
} 

因爲if報表評估Boolean表情,你正在試圖做的是從Nullable<bool>.bool的隱式轉換。

bool someBoolean; 
IEnumerable<int> someList = null; 

// Cannot implicity convert type 'bool?' to 'bool'. 
someBoolean = someList?.Any(); 

Nullable<T>確實提供了一種方法GetValueOrDefault可用於避免真或假的比較。但我會爭辯說,你的原始代碼更清潔。

if ((list?.Any()).GetValueOrDefault()) 

另一種可能吸引你的選擇是創建你自己的擴展方法。

public static bool AnyOrDefault<T>(this IEnumerable<T> source, bool defaultValue) 
{ 
    if (source == null) 
     return defaultValue; 

    return source.Any(); 
} 

使用

if (list.AnyOrDefault(false)) 
+2

我將問題解釋爲「爲什麼不'如果'接受'布爾?'的條件?」 –

+0

所以問題是爲什麼明確的轉換是好的,但隱含的轉換沒有?這不是關於接受'bool?'條件。 – Centro

+0

@Centro因爲如果你嘗試轉換'null',顯式轉換會拋出一個異常。應該不惜一切代價避免拋出異常的隱式轉換,所以我們不能讓隱式轉換以同樣的方式進行。我們也不能將'null'隱式轉換爲'false',因爲這是不合理的。例如,你可能希望'if(!list?.Any())'與if(list?Any())'相反。但是,如果'list == null',那麼這兩者最終都是'if(null)'。 – Kyle