2016-12-05 28 views
3

我有一個擴展方法,看起來像這樣:爲什麼使用ConditionalAccessExpression會改變我的擴展方法的工作方式?

public static bool DoesNotExist(this object toCheck) 
{ 
    return toCheck == null; 
} 

一般我使用這樣的:

if(myObject.DoesNotExist()) 
{ 
} 

我有一個包含這樣

if (myObject?.MyProperty == null) 
條件訪問表達的表達

編譯器很滿意。如果我是表達式中使用我的擴展方法,像這樣:

if (myObject?.MyProperty.DoesNotExist()) 

然後我得到一個編譯錯誤

CS0266無法隱式轉換類型'布爾?到'布爾'。存在明確的轉換(您是否缺少演員?)

MyProperty的類型是來自我的域的某個對象,而不是bool。

爲什麼會發生這種情況,我可以預防嗎?

+2

'if((myObject?.MyProperty).DoesNotExist())'似乎工作雖然 – haim770

+0

@ haim770有趣。謝謝你,我可以使用它。 –

回答

8

一個空條件表達式總是有一個可爲空的返回類型 - 畢竟,如果左邊爲空,它必須有一個總體結果null

因此myObject?.MyProperty.DoesNotExist()的類型是Nullable<bool>,它不能用作if語句的條件。

很容易修復或者通過與bool不變,或使用空合併運算符直接比較:

if (myObject?.MyProperty.DoesNotExist() == true) 

if (myObject?.MyProperty.DoesNotExist() ?? false) 

在這兩種這些情況下,如果myObject爲空,執行將不進入體內if聲明。如果你想在相反的行爲,你可以使用:

if (myObject?.MyProperty.DoesNotExist() != false) 

if (myObject?.MyProperty.DoesNotExist() ?? true) 

但是,我不知道你的擴展方法實際上是有用的 - 至少不是在這裏。如果你只是在做一個空的比較,直接做到這一點:

if (myObject?.MyProperty == null) 

這將進入if語句體如果要麼myObject爲null,myObject.MyProperty爲空。

+0

謝謝。當我編寫一個roslyn分析器時,問題出現了,它提供了將'== null'改爲使用'DoesNotExist',並且已經刪除了包含條件訪問表達式的表達式的自動修復的提供,這似乎是合理的這裏要做的事情。 –

+1

@SamHolder:對,在這種情況下你可能想要''?真正的版本。雖然我個人不介意,但我認爲在'== null'版本下更容易...... –

+0

是啊,我要堅持在這種情況下'== null'版本我認爲,除非我包圍整個表達式在一個額外的括號集作爲'(myObject?.MyProperty).DoesNotExist()'工作正常正如@ haim770在關於這個問題的評論中指出的那樣。可能只是堅持檢查null –

相關問題