2016-07-01 12 views
0

以下のプログラムでは、(!testlist.Any())が引数のNULL例外をスローします。 Any()拡張メソッドはデフォルトでヌル値を処理しませんか?Any()拡張メソッドはnull値を処理しますか?

これには適切な方法はありますか?方法でパラメータとしてList<int>が使用されているときにAny()の前にnullチェックを追加する必要がありますか?

public class Program 
    { 
     public static void Main(string[] args) 
     { 

      Console.WriteLine("Hello, world!"); 

      foo(null); 
     } 

     public static void foo(List<int> testlist) 
     { 
      if (!testlist.Any()) 
      { 
       Console.WriteLine("testlist is empty!"); 
      } 
     } 
    } 
+0

'もし(!?偽testlistという.ANY()??){doStuff( testList); } 'あなたが例外を再スローしたいのでない限り。 – Mephy

+4

例外をスローすることによって、コレクションのnull値を「処理」します。 –

+0

は、 'ソースまたは述語がnullの場合に' ArgumentNullException'をスローします。 –

答えて

6

ヌルチェックが(任意の前に追加する必要がある)リストがメソッドに パラメータとして使用されている場合?

はい、正しいアプローチです。メソッドは意味のあるメッセージですばやく失敗するはずです。

public static void foo(List<int> testlist) 
{ 
    if(testlist == null) 
     throw new ArgumentNullException(nameof(testlist), $"{nameof(testlist)} must not be null"); 
    if (!testlist.Any()) 
    { 
     Console.WriteLine("testlist is empty!"); 
    } 
} 

もちろん、Enumerable.Anyはこれを処理しません。 nullがこのメソッドに渡されたか、実行可能なオプションである可能性があります。 あなただけがを知っています。

例外もdocumentedです:

"ArgumentNullException:ソースがnullです。"

あなたはそれをスローする必要はありませんが、あなたは、ヌルを受け入れるだけでこのケースを処理する場合:

if(testlist == null || !testlist.Any()) 
{ 
    Console.WriteLine("testlist is null or empty!"); 
} 
else .... 
+0

また、メソッドの規約でヌルの 'testList'がOKであると言われた場合は、全く失敗しないはずです。私はそれが良い解決策だとは思わないが、OPがこのような状況にある理由がある可能性がある。 –

+0

この方法を使用しているユーザーは技術的なものではありません。彼らはまだnull値を渡すかもしれない&このメソッドは "emptylist"を返すかもしれない –

関連する問題