2017-08-09 17 views
-1

場合、このコードが動作するのはなぜ:ヌル条件演算子とステートメント

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

しかし、このコードにはない:

if (list?.Any()) 

エラーCS0266は、暗黙的にタイプ変換できませんと言って「ブール値を?」

なぜのような暗黙の変換を行う言語機能ではないのですか?文の場合はどうなりますか?

+2

はなぜ 'if'文は'ブール? '条件を受け入れないのですか?結果がnullの場合、あなたが行きたいと思う方法はかなり曖昧です。デフォルトではfalse(効果的)に設定されていますが、他の場合にはデフォルトをtrueにしたいと考えています。 –

+0

'list?.Any()'は、listがnullの場合に 'null'になる可能性があります。 Anyがboolを返すと、boolを返す可能性があります。したがって、コンパイル時にヌルブール値 – 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

質問はなぜ明示的な変換はOKですが、暗黙的な変換ではないのですか?これは 'bool? '条件を受け入れることではありません。 – Centro

+0

@Centro 'null'をキャストしようとすると、明示的な変換によって例外がスローされるためです。例外を投げる暗黙のコンバージョンは、すべてのコストをかけて回避する必要があります。したがって、暗黙的な変換は同じ方法で実行することはできません。また、 'null'を' false'に暗黙的に変換することはできません。なぜなら、それは不合理だからです。例えば、 'if(!list?Any())'が 'if(list?Any())'の反対であるとします。しかし 'list == null'の場合、それらの両方は' if(null) 'になります。 – Kyle