拡張メソッドが null インスタンスで呼び出された場合 (拡張メソッドがそれを許可していない場合) にスローするのに最適な例外の種類は何だと思いますか? 拡張メソッドは静的メソッドに過ぎないので、ArgumentNullException であるべきだと主張することもできますが、一方でインスタンス メソッドのように使用されるため、NullReferenceException を使用する方が自然かもしれません。次の例を見てみましょう。
public static string ToInvariantString(this IFormattable value, string format)
{
return value.ToString(format, CultureInfo.InvariantCulture);
}
このようにして、値パラメーターが null の場合、NullReferenceException がスローされます。
他の例は次のようになります。
public static string ToInvariantString(this IFormattable value, string format)
{
if (value == null) throw new ArgumentNullException("value");
return value.ToString(format, CultureInfo.InvariantCulture);
}
編集: いくつかの回答では、拡張メソッドを静的メソッドのように呼び出すことができ、その場合、null 参照例外が間違っていることを指摘しました。これは素晴らしい点であり、実際に私の懸念の 1 つですが、理由はわかりませんそもそも質問でそれを言うのを忘れていました。
また、誰かが NullReferenceException をスローするのは間違っていると指摘しましたが、そうです。メソッドを保護せずに、発生させます (CLR にスローさせます)。
私は ArgumentNullException を支持していると思います (これは私がこれまで使用してきたものです) が、メソッドが使用されるほとんどの場所でより自然に見えるため、少なくとも NullReferenceException に反対する余地があると思います。