Mam klasa bazowa A
metody Dlaczego przeciążony ma niższy priorytet niż metody instancji
public class A
{
public virtual void Method(A parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public virtual void Method(B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
Inhereted B
public class B : A
{
public virtual void Method(object parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public override void Method(A parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
public override void Method(B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
klasa statyczna S
metodą wydłużania
public static class S
{
public static void Method(this B instance, B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
Przykład tworzymy instancję typu B
i wywołaj na nim Method
, spodziewamy się, że będzie to public override void Method(B parameter)
rzeczywisty wynik to public virtual void Method(object parameter)
.
var b = new B();
b.Method(new B()); // B.Method (Object parameter) Why???
Dlaczego kompilator nie wybiera bardziej odpowiedniej metody ??? UPD I dlaczego nie jest to metoda rozszerzenia?
'B' nie jest zagnieżdżony, ale dziedziczony. –
@Henk Holterman dzięki – user854301
metoda rozszerzenia nie jest wywoływana, jeśli obiekt ma metodę o tej samej nazwie. ma to na celu uniknięcie zerwania starego kodu, gdy oczekiwaniem jest wywołanie starej metody, a nie nowego rozszerzenia. – Ankush