Рассмотрим следующий фрагмент кода:
using System;
class Base
{
public virtual void Foo(int x)
{
Console.WriteLine("Base.Foo(int)");
}
}
class Derived : Base
{
public override void Foo(int x)
{
Console.WriteLine("Derived.Foo(int)");
}
public void Foo(object o)
{
Console.WriteLine("Derived.Foo(object)");
}
}
public class Program
{
public static void Main()
{
Derived d = new Derived();
int i = 10;
d.Foo(i);
}
}
И удивительный результат:
Derived.Foo(object)
Я бы ожидал, что он выберет переопределенный метод Foo(int x)
, поскольку он более конкретный. Однако компилятор С# выбирает не унаследованную версию Foo(object o)
. Это также приводит к боксерской операции.
В чем причина такого поведения?