在null实例(扩展方法不允许)的情况下调用扩展方法时,您认为是最好的异常类型是什么?由于扩展方法只不过是静态方法,你可以说它应该是ArgumentNullException,但另一方面它们像实例方法一样使用,因此使用NullReferenceException可能更自然.我们来看下面的例子:
public static string ToInvariantString(this IFormattable value, string format)
{
    return value.ToString(format, CultureInfo.InvariantCulture);
}
这样,如果value参数为null,则抛出NullReferenceException.
另一个例子是:
public static string ToInvariantString(this IFormattable value, string format)
{
    if (value == null) throw new ArgumentNullException("value");
    return value.ToString(format, CultureInfo.InvariantCulture);
}
编辑: 在一些答案中,你已经指出扩展方法可以像静态方法一样调用,在这种情况下,空引用异常会出错,这是一个很好的观点,实际上是我关注的一个问题,不知道为什么我忘了首先在问题中提到这一点.
有人还指出抛出NullReferenceException是错误的,是的,确实如此.这就是为什么我不扔它,我只是让它发生(让CLR抛出它)不守护方法.
我认为我赞成ArgumentNullException(这是我到目前为止所使用的)但我仍然认为至少有空间来反对NullReferenceException,因为在大多数将要使用该方法的地方看起来更自然.
可能重复:
C#:在扩展方法中验证"this"参数的最佳实践
我对设计选择感到矛盾,并希望听到SO社区的意见.我在这里提出的例子只是一个可能的情况,必须进行这种设计选择 - 实际上,可能会有更多的情况.对这个具体案例和更一般的方法都欢迎回答,并且对于如何在特定案例中做出决定的指导方针也表示赞赏.
基本上,我想知道如何考虑这个:当编写一个扩展方法,如果将null引用作为this实例传递,本质上不会失败,是否应该对参数执行null检查?
例:
我正在编写一个扩展方法IEnumerable<T>,它将遍历集合并执行一些Action<T>- 基本上,这就是它的作用:
public static void Each<T>(this IEnumerable<T> collection, Action<T> action)
{
    foreach (var t in collection)
    {
        action.Invoke(t);
    }
}
我无法决定的是,如果null传递给任一参数,这个扩展方法应该做什么.如果我不添加任何空检查,我将得到一个NullReferenceExceptionon action.Invoke(T),但是如果collection是nullfor循环将只是默默地做什么(并且即使action也是null...... 也不会抛出异常).
我决定添加一个空检查action,所以我可以抛出一个ArgumentNullException而不是NullReferenceException.但是我该collection怎么做呢?
选项1:添加空检查,并抛出ArgumentNullException.
选项2:只是默默地让方法什么都不做.
哪个在将来我想要使用该方法会更有用?为什么?