Я только что наткнулся на очень интересную проблему. Приведем следующий код:
using System;
class Program
{
class A { }
class B : A { }
private static void MyMethod(A a) /* first method */
{
Console.WriteLine("A"); ;
}
private static void MyMethod(B b) /* second method */
{
Console.WriteLine("B");
}
static void Main(string[] args)
{
var a = new A();
// Call first method
MyMethod(a);
A b = new B();
// Should call the second method
MyMethod(b);
Console.ReadLine();
}
}
Я ожидал, что будет вызван второй метод, потому что тип среды выполнения переменной - B. Есть идеи, почему код вместо этого вызывает первый метод?
Спасибо, Тиби
Некоторые пояснения: Полиморфизм означает несколько форм, которые не имеют ничего общего с тем, где вы объявляете метод.
Перегрузка метода - это форма полиморфизма, специального полиморфизма.
Способ, которым полиморфизм обычно реализуется, заключается в использовании позднего связывания.
dynamic - это обходной путь для этой проблемы.
Дело в том, что это не работает в C # (или Java), это дизайнерское решение, которое я хотел бы понять, почему было сделано, и ни один из ответов не отвечает на этот вопрос.
/ Тиби