如果在空實例上調用擴展方法時(擴展方法不允許),您會認爲什麼是最佳異常類型?由於擴展方法不過是靜態方法,所以您可能會認爲它應該是ArgumentNullException,但另一方面,它們會像實例方法一樣使用,因此使用NullReferenceException可能更自然。讓我們來看看下面的例子:從擴展方法的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);
}
編輯: 在一些你已經指出,一個擴展方法可以這樣調用靜態方法的答案,並在這些情況下,一個空引用異常會是錯誤的,這是一個很好的觀點,實際上是我的一個擔憂,我不確定爲什麼我忘記在第一個問題中提到這個問題。
有人還指出,拋出一個NullReferenceException是錯誤的,是的,它是。這就是爲什麼我不扔掉它,我只是讓它發生(讓CLR扔掉它),而不是守護這個方法。
我認爲我贊成ArgumentNullException(這是我迄今爲止使用的),但我仍然認爲至少有空間爭論反對NullReferenceException,因爲在大多數方法將要使用的地方它似乎更自然使用。
偉大的評論和我在我的帖子編輯中提到這是我沒有明確拋出NullReferenceException的原因,我仍然讓CLR拋出它。 – 2009-01-20 22:10:12