Почему параметры в конструкторах для ArgumentNullException и ArgumentException меняются на противоположные?

При разработке программного обеспечения я всегда поддерживал согласованность, если нет веской причины быть непоследовательной.

В .NET Framework, мы имеем ArgumentNullException и ArgumentOutOfRangeException, которые оба получены из ArgumentException. Все 3 из них имеют конструктор, который принимает два строковых параметра: один для paramName и один для исключения message.

Почему оба производных класса меняют порядок параметров?!

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
}

Для меня это кажется действительно нелогичным и часто меня смущает. Есть ли вообще какая-то причина для этого дизайна Microsoft? Существуют ли какие-либо преимущества в обратном порядке при использовании этих двух полученных исключений?

Ответы

Ответ 1

Поскольку конструктор, который принимает только один аргумент, принимает другой аргумент:

ArgumentNullException(String) принимает paramName как аргумент, ArgumentException(String) принимает значение message.

На самом деле это очень непротиворечиво. Двухстрочный конструктор просто добавляет аргумент, сохраняя первый идентичный.

Обоснование этого, вероятно, потому, что ArgumentNullException не нуждается в сообщении. Сообщение присуще типу исключений.