null オブジェクトでAny()を呼び出すと、C# では ArgumentNullException がスローされます。オブジェクトが null の場合、間違いなく「何も」存在せず、おそらく false を返すはずです。
C# がこのように動作するのはなぜですか?
null オブジェクトでAny()を呼び出すと、C# では ArgumentNullException がスローされます。オブジェクトが null の場合、間違いなく「何も」存在せず、おそらく false を返すはずです。
C# がこのように動作するのはなぜですか?
Any()
「このボックスにはアイテムが含まれていますか?」
ボックスが空の場合、答えは明らかにノーです。
しかし、そもそもボックスがない場合、質問は意味をなさず、関数は「一体何を話しているのですか?ボックスはありません」と文句を言います。
欠落しているコレクションを空のコレクションのように扱いたい場合は、次の拡張メソッドを使用します。
public static IEnumerable<T> OrEmpty<T>(this IEnumerable<T> sequence)
{
return sequence ?? Enumerable.Empty<T>();
}
foreach
これは、だけでなく、すべてのLINQメソッドおよびと組み合わせることができます.Any()
。
参照型を扱う場合、null
値は「空の」値とは意味的に異なります。
null
文字列はと同じではなく、string.Empty
aはと同じでnull
IEnumerable<T>
はありません Enumerable.Empty<T>
(またはそのタイプの他の「空の」列挙可能なもの)。
Any
拡張メソッドでない場合は、それを呼び出すとnull
結果がになりNullReferenceException
ます。これは拡張メソッドであるため、(必須ではありませんが)例外をスローすることをお勧めします。これは、null
:BOOM!でメソッドを呼び出そうとする際のよく知られたセマンティクスを保持するためです。
Any()
は拡張メソッドであるため、this
実際にはメソッドの最初の引数として渡されます。この状況では、投げることは理解できArgumentNullException
ます。this
null
事前に自分でチェックを行うことができます。
bool hasAny = yourData == null ? false : yourData.Any(yourPredicate);
Any() は次のような拡張メソッドであるためです。
public static bool Any(this IEnumerable enumerable)
{
if (enumerable == null)
throw ArgumentNullException("enumerable");
...
}
このAny
メソッドは に対して実行され、 Enumerable にIEnumerable
項目があるかどうかを通知します。列挙するものを何も与えない場合は、 ArgumentNullException が合理的です。(一致する) 要素のないコレクションは、コレクションがないこととは異なります。
他の人がすでに述べたようにAny
、シーケンスに要素が含まれているかどうかを確認します。値を渡すことを妨げるものではありませんnull
(そもそもバグである可能性があります)。
Enumerable
クラス内のすべての拡張メソッドは、 isのArgumentNullException
場合にan をスローします。拡張機能を投入することは、実際には良い習慣です。source
null
ArgumentNullExceptions