Почему перегрузка не работает?
Почему после запуска программа будет отображаться C::Foo(object o)
?
using System;
namespace Program
{
class A
{
static void Main(string[] args)
{
var a = new C();
int x = 123;
a.Foo(x);
}
}
class B
{
public virtual void Foo(int x)
{
Console.WriteLine("B::Foo");
}
}
class C : B
{
public override void Foo(int x)
{
Console.WriteLine("C::Foo(int x)");
}
public void Foo(object o)
{
Console.WriteLine("C::Foo(object o)");
}
}
}
Не могу понять, почему, когда вы вызываете C :: Foo
, выбираете метод с object
, а не с int
. Что класс B
и этот метод отмечен как переопределение?
В классе C
существует два метода с тем же именем, но с разными параметрами, не перегружен ли он? Почему нет? Имеет ли значение, что один из методов должен быть переопределен в родительском? Это как-то отключает перегрузку?
Ответы
Ответ 1
Посмотрите Поиск участников
Сначала набор всех доступных (раздел 3.5) членов с именем N объявленный в T, и построены базовые типы (раздел 7.3.1). Объявления, содержащие модификатор переопределения, исключаются из набора. Если ни один из членов с именем N не существует и не доступен, тогда поиск не соответствует, и следующие шаги не оцениваются.
Итак, в соответствии с этим он будет использовать
public void Foo(object o)
первый
Ответ 2
Объявления, содержащие модификатор переопределения, исключены из набора.
Перегрузка базового метода в производном классе
Производный класс с использованием неправильного метода
Вместо этого используйте override
, вы должны использовать new
:
public new void Foo(int x)
{
Console.WriteLine("C::Foo(int x)");
}
public void Foo(object o)
{
Console.WriteLine("C::Foo(object o)");
}