Иерархия вызова конструктора во время наследования - как с параметрами, так и без них

Прежде всего, это не дублирующий вопрос.

Я знаю факты, которые:

  • При наследовании порядок выполнения конструкторов будет в том же порядке, что и их вывод и порядок выполнения деструкторов будут в обратном порядке их вывода.
  • Кроме того, мы можем явно вызвать конструктор базового класса, используя ключевое слово base в определении конструктора.

Мой вопрос: Для моего ниже кода

class ClassA
{
    public ClassA(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassA");
    }
}
class ClassB : ClassA
{
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}
class ClassC : ClassB
{
    public ClassC(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassC");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassC classc = new ClassC(1);
        Console.ReadLine();
    }
}

Я получаю ошибку времени выполнения:

'ClassA' does not contain a constructor that takes 0 arguments
'ClassB' does not contain a constructor that takes 0 arguments

Но когда я добавляю конструкторы по умолчанию к обоим классам как:

class ClassA
{
    public ClassA()
    {
        Console.WriteLine("Default Constructor of ClassA");
    }
    public ClassA(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassA");
    }
}
class ClassB : ClassA
{
    public ClassB()
    {
        Console.WriteLine("Default Constructor of ClassB");
    }
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}
class ClassC : ClassB
{
    public ClassC()
    {
        Console.WriteLine("Default Constructor of ClassC");
    }
    public ClassC(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassC");
    }
}

class Program
{
    static void Main(string[] args)
    {
        ClassC classc = new ClassC(1);
        Console.ReadLine();
    }
}

Я получил результат, как ожидалось.

Default Constructor of ClassA
Default Constructor of ClassB
Parameterized Constructor of ClassC

SO это означает, что во время наследования всем базовым классам нужен конструктор без параметров.

У меня пока не было четких объяснений. Пожалуйста, не делайте это как дубликат, и любое хорошее объяснение ценится.

Ответ 1

Нет

class ClassB : ClassA
{
    public ClassB(int a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

совпадает с

class ClassB : ClassA
{
    public ClassB(int a):base()
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

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

class ClassB : ClassA
{
    public ClassB(int a):base(a)
    {
        Console.WriteLine("Parameterized Constructor of ClassB");
    }
}

Кроме того, это не имеет никакого отношения к порядку вызова конструкторов. Это происходит во время выполнения. У вас проблемы с компиляцией.