しかし、インスタンスメソッドの呼び出しとは異なり、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
を返すと期待するのは間違いでしょうか?
まず、そのソースコードでは 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