Any() がヌル参照例外をスローしないことを期待するのは不合理でしょうか?
しかし、インスタンスメソッドの呼び出しとは異なり、null に対して呼び出すと NullReferenceException
-'がスローされないので、手動でチェックしてスローする必要があります。
Linq拡張メソッド Any()
の実装では、Microsoftは ArgumentNullException
(https://github.com/dotnet/corefx/blob/master/src/System.Linq/src/System/Linq/AnyAll.cs) を投げることにしました。
if( myCollection != null && myCollection.Any() )` と書かないといけないのが面倒くさい。
このコードのクライアントとして、例えば ((int[])null).Any()
が false
を返すと期待するのは間違いでしょうか?
41
3
ジャガイモが5個入っている袋があります。袋の中に
.Any()
ジャガイモが入っていますか?"Yes,"と言ってください。と言う。
私はジャガイモを全部取り出して食べます。袋の中に
.Any()
のジャガイモがありますか?"_No,"と言うんですね。`
まず、そのソースコードでは
NullReferenceException
ではなく、ArgumentNullException
がスローされるようです。とはいえ、多くの場合、コレクションがNULLでないことはすでに知っているはずです。このコードは、コレクションがすでに存在していることを知っているコードからのみ呼び出されるので、NULLチェックを入れる必要はあまりないはずです。 しかし、もしコレクションが存在することを知らないのであれば、
Any()
を呼び出す前にチェックすることは意味があります。このコードのクライアントとして、例えば
((int[])null).Any()
がfalse
を返すと期待するのは間違いでしょうか?もしこのコレクションが存在しないのであれば、この質問自体が意味を持ちません。
Nullは情報の欠落を意味し、要素がないことを意味しない。
例えば、組み込みの空の列挙体の一つを使用して、nullの代わりに要素のないコレクションを表現することができます。
もし、ある状況でnullを返しているのであれば、空のコレクションを返すように変更するかもしれません。
以下も参照してください。 https://stackoverflow.com/questions/1191919/what-does-linq-return-when-the-results-are-empty