为什么ArgumentNullException和ArgumentException的构造函数中的参数是相反的?

Con*_*ell 16 .net c#

在设计软件时,我总是喜欢一致性,除非有一个非常好的理由不一致.

在.NET Framework中,我们有ArgumentNullExceptionArgumentOutOfRangeException,它们都来自ArgumentException.所有这三个都有一个构造函数,它接受两个字符串参数 - 一个用于paramName,一个用于异常message.

为什么两个派生类都反转了参数顺序?!

public ArgumentNullException(String paramName, String message)
    : base(message, paramName) { }

public ArgumentOutOfRangeException(String paramName, String message)
    : base(message, paramName) { }
Run Code Online (Sandbox Code Playgroud)

这意味着在我的调用代码中,它看起来像这样:

public string DoSomething(string name, int age)
{
    if (name == null)
        throw new ArgumentNullException("name", "Name cannot be null.");

    if (name == string.Empty)
        throw new ArgumentException("Name cannot be an empty string.", "name");

    if (age < 18)
        throw new ArgumentOutOfRangeException("age", "Age must be at least 18.");

    //Do stuff
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这似乎是不合逻辑的,常常让我感到困惑.微软在这个设计选择上有什么理由吗?使用这两个派生的异常时,反转顺序是否有任何优势?

Bar*_*chs 15

因为只接受一个参数的构造函数采用不同的参数:

ArgumentNullException(String)需要paramName作为参数,ArgumentException(String)需要一个message.

这实际上非常一致.双字符串构造函数只是添加一个参数,保持第一个相同.

背后的原因,可能是因为ArgumentNullException不需要消息.该消息是异常类型中固有的.

  • 在某种程度上是一致的,在所有其他方面都是可怕的.最不惊讶的原则不是例外,而是人为错误. (4认同)