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 を返すと期待するのは間違いでしょうか?

ジャガイモが5個入っている袋があります。袋の中に .Any() ジャガイモが入っていますか?

"Yes,"と言ってください。と言う。

私はジャガイモを全部取り出して食べます。袋の中に.Any()のジャガイモがありますか?

"_No,"と言うんですね。`

解説 (11)

まず、そのソースコードでは NullReferenceException ではなく、ArgumentNullException がスローされるようです。

とはいえ、多くの場合、コレクションがNULLでないことはすでに知っているはずです。このコードは、コレクションがすでに存在していることを知っているコードからのみ呼び出されるので、NULLチェックを入れる必要はあまりないはずです。 しかし、もしコレクションが存在することを知らないのであれば、Any()を呼び出す前にチェックすることは意味があります。

このコードのクライアントとして、例えば ((int[])null).Any()false を返すと期待するのは間違いでしょうか?

もしこのコレクションが存在しないのであれば、この質問自体が意味を持ちません。

解説 (17)

Nullは情報の欠落を意味し、要素がないことを意味しない。

例えば、組み込みの空の列挙体の一つを使用して、nullの代わりに要素のないコレクションを表現することができます。

もし、ある状況でnullを返しているのであれば、空のコレクションを返すように変更するかもしれません。

以下も参照してください。 https://stackoverflow.com/questions/1191919/what-does-linq-return-when-the-results-are-empty

解説 (4)