Подтвердить что ты не робот

Почему компилятор автоматически запускается без дальнейшего наследования?

Пока я пытаюсь запустить следующий фрагмент кода, он выполняет неправильный метод перегрузки. Я смущен, почему это так? [ testB.TestMethod(testValue) метод public double TestMethod(double value)]

public class TestA
{
    public int TestMethod(int value)
    {
        return value;
    }
}

public class TestB : TestA
{
    public double TestMethod(double value)
    {
        return value;
    }
}

static void Main( string[] args )
{
    TestB testB = new TestB();

    int testValue = 3;

    testB.TestMethod(testValue);
}

Есть ли у вас какие-либо идеи об этом?

Есть ли способ вызвать метод класса TestA через экземпляр TestB без передачи как TestA.?

Но этого не происходит в JAVA и С++

4b9b3361

Ответ 1

Из спецификации в разделе "Разрешение перегрузки":

... и методы в базовом классе не являются кандидатами, если применим какой-либо метод в производном классе (§7.6.5.1).

Ответ 2

Наследование

Наследование может вызвать запутанный эффект. Когда компилятор идет ищет перегрузки метода экземпляра, он считает, что время компиляции класс "цели" вызова и рассматривает объявленные методы там. Если он не может найти что-либо подходящее, он затем смотрит на родителя класс... затем класс дедушки и т.д. Это означает, что если есть два метода на разных уровнях иерархии, "более глубокий" будет выбрана первыми, даже если это не "лучший член функции" для вызов.

источник: http://csharpindepth.com/Articles/General/Overloading.aspx