場合、このコードが動作するのはなぜ:ヌル条件演算子とステートメント
if (list?.Any() == true)
しかし、このコードにはない:
if (list?.Any())
エラーCS0266は、暗黙的にタイプ変換できませんと言って「ブール値を?」
なぜのような暗黙の変換を行う言語機能ではないのですか?文の場合はどうなりますか?
場合、このコードが動作するのはなぜ:ヌル条件演算子とステートメント
if (list?.Any() == true)
しかし、このコードにはない:
if (list?.Any())
エラーCS0266は、暗黙的にタイプ変換できませんと言って「ブール値を?」
なぜのような暗黙の変換を行う言語機能ではないのですか?文の場合はどうなりますか?
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))
私は質問を"なぜ' 'もし' 'ブール? '条件を受け入れないのですか?" –
質問はなぜ明示的な変換はOKですが、暗黙的な変換ではないのですか?これは 'bool? '条件を受け入れることではありません。 – Centro
@Centro 'null'をキャストしようとすると、明示的な変換によって例外がスローされるためです。例外を投げる暗黙のコンバージョンは、すべてのコストをかけて回避する必要があります。したがって、暗黙的な変換は同じ方法で実行することはできません。また、 'null'を' false'に暗黙的に変換することはできません。なぜなら、それは不合理だからです。例えば、 'if(!list?Any())'が 'if(list?Any())'の反対であるとします。しかし 'list == null'の場合、それらの両方は' if(null) 'になります。 – Kyle
はなぜ 'if'文は'ブール? '条件を受け入れないのですか?結果がnullの場合、あなたが行きたいと思う方法はかなり曖昧です。デフォルトではfalse(効果的)に設定されていますが、他の場合にはデフォルトをtrueにしたいと考えています。 –
'list?.Any()'は、listがnullの場合に 'null'になる可能性があります。 Anyがboolを返すと、boolを返す可能性があります。したがって、コンパイル時にヌルブール値 – Nkosi
しかし、これを超えて、MadsやC#デザインチームの他の人が答えなければ、基本的には投機を受けるつもりです。 –