Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么ArgumentNullException和ArgumentException的构造函数中的参数是反向的?_C#_.net - Fatal编程技术网

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

C# 为什么ArgumentNullException和ArgumentException的构造函数中的参数是反向的?,c#,.net,C#,.net,在设计软件时,我总是倾向于一致性,除非有很好的理由证明不一致 在.NET框架中,我们有and,它们都源自ArgumentException。这三个函数都有一个接受两个字符串参数的构造函数,一个用于paramName,另一个用于异常消息 为什么两个派生类都颠倒参数顺序 public ArgumentNullException(String paramName, String message) : base(message, paramName) { } public ArgumentOu

在设计软件时,我总是倾向于一致性,除非有很好的理由证明不一致

在.NET框架中,我们有and,它们都源自
ArgumentException
。这三个函数都有一个接受两个字符串参数的构造函数,一个用于
paramName
,另一个用于异常
消息

为什么两个派生类都颠倒参数顺序

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

public ArgumentOutOfRangeException(String paramName, String message)
    : base(message, paramName) { }
这意味着在我的呼叫代码中,它看起来像这样:

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
}
publicstringdosomething(字符串名,整数)
{
if(name==null)
抛出新ArgumentNullException(“name”,“name不能为null”);
if(name==string.Empty)
抛出新ArgumentException(“名称不能是空字符串。”,“名称”);
if(年龄<18岁)
抛出新的ArgumentOutOfRangeException(“年龄”,“年龄必须至少为18岁”);
//做事
}

对我来说,这似乎真的不合逻辑,经常让我困惑。微软在这里选择这种设计有什么理由吗?当使用这两个派生异常时,颠倒顺序有什么好处吗?

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

ArgumentNullException(String)
paramName
作为参数,
ArgumentException(String)
消息作为参数

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


其背后的原因很可能是因为
ArgumentNullException
不需要消息。消息是异常类型固有的。

我怀疑
ArgumentNullException
ArgumentOutOfRangeException
的作者更喜欢参数/消息顺序,并且无法更改
ArgumentException
的顺序,可能是Microsoft的某个人搞砸了,代码审阅者没有注意到这一点。我发现了这一点,但这就提出了一个问题:为什么单参数版本对这两个类来说是
paramName
,而对基类来说是
message
?更混乱@ConnellWatkins我认为是因为这个消息可以从异常类型(我更新了我的答案)中理解。一方面是一致的,另一方面是可怕的。最小惊讶原则也不例外,但这是人为的错误。