Информация об изменениях

Сообщение Re[4]: почему в C# до сих пор нет наследования конструкторов от 01.12.2022 3:03

Изменено 01.12.2022 3:32 xpalex

Re[4]: почему в C# до сих пор нет наследования конструкторов
Здравствуйте, Sharov, Вы писали:

C>>Никогда не видел такое?

C>>
C>>    public MyException()
C>>    {
C>>    }

C>>    public MyException(string? message) : base(message)
C>>    {
C>>    }

C>>    public MyException(string? message, Exception? innerException) : base(message, innerException)
C>>    {
C>>    }
    
C>>    ...
C>>


S>Так что не так и что предлагается улучшить?

S>Т.е. неохота всей этой писанины, если будет вызываться только один контсруктор, соотв. только его и наследуем?
S>Так или не так?

Самое забавное, что эта реализация тоже не ок. Если вдруг появится необходимость в дополнительной инициализации (например добавится новое поле или еще что-то), то придется дублировать код инициализации во всех трех конструкторах.
Идиоматичней бьыло бы так:
    public MyException() : this(null, null)
    {
    }

    public MyException(string? message) : this(message, null)
    {
    }

    public MyException(string? message, Exception? innerException) : base(message, innerException)
    {
           // any additional init goes here ... 
    }
    
    ...

Но это рушит чью-то картину необходимости автоматической генерации конструкторов.
Re[4]: почему в C# до сих пор нет наследования конструкторов
Здравствуйте, Sharov, Вы писали:

C>>Никогда не видел такое?

C>>
C>>    public MyException()
C>>    {
C>>    }

C>>    public MyException(string? message) : base(message)
C>>    {
C>>    }

C>>    public MyException(string? message, Exception? innerException) : base(message, innerException)
C>>    {
C>>    }
    
C>>    ...
C>>


S>Так что не так и что предлагается улучшить?

S>Т.е. неохота всей этой писанины, если будет вызываться только один контсруктор, соотв. только его и наследуем?
S>Так или не так?

Самое забавное, что эта реализация тоже не ок. Если вдруг появится необходимость в дополнительной инициализации (например добавится новое поле или еще что-то), то придется дублировать код инициализации во всех трех конструкторах.
Идиоматичней было бы так:
    public MyException() : this(null, null)
    {
    }

    public MyException(string? message) : this(message, null)
    {
    }

    public MyException(string? message, Exception? innerException) : base(message, innerException)
    {
           // any additional init goes here ... 
           Console.WriteLine("MyException was created at {0}", DateTime.UtcNow);
    }
    
    ...


Но это рушит чью-то картину необходимости и тем более корректности автоматической генерации конструкторов.