2016-12-05 14 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のタイプは、私のドメインのオブジェクトであり、ブールではありません。

なぜこのようなことが起こりますか?それを防止できますか?

+2

'if((myObject?.MyProperty).DoesNotExist())'は動作するようですが、 – haim770

+0

@ haim770が面白いです。ありがとう、私はそれを使用することができるかもしれません。 –

答えて

8

null条件式は常にnullableの戻り値の型を持ちます。結局のところ、左辺がnullの場合は全体的な結果がnullである必要があります。

myObject?.MyProperty.DoesNotExist()のタイプはNullable<bool>であり、ifステートメントの条件として使用することはできません。 myObjectがnullの場合、実行はの身体に入らないだろう、これらの例の両方で

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

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

それはbool定数、またはnull合体演算子を使用して直接比較することによってどちらか修正するのは簡単ですifステートメントあなたが逆の行動をしたい場合は、使用することができます。

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

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

しかし、私はあなたの拡張メソッドは、実際に役に立つものであることはよく分からない - 少なくともここにいません。あなただけのヌル比較をやっている場合は、直接それを行う:if文の本体に入ります

if (myObject?.MyProperty == null) 

いずれかmyObjectがnullの場合、またはmyObject.MyPropertyがnullです。

+0

ありがとうございます。私が '== null'を' DoesNotExist'を使うように変更するroslynアナライザを書いているときに問題が発生し、条件付きアクセス式を含む式の自動修正のオファーが削除されました。ここですること。 –

+1

@SamHolder:そうなら、おそらく '??真のバージョン。個人的には、とにかくこれを止めるつもりですが、 '== null'バージョンの下では簡単だと思います。 –

+0

ええ、 '(=Object).DoesNotExist()'がうまくいきますので、大文字と小文字を別の括弧で囲っていなければ、 '== null'を使うことにします。 @ haim770は質問のコメントで指摘したとおりです。おそらくちょうどヌルをチェックすることに固執する –

関連する問題