この非常に単純な例は私を混乱させます:
public class X {
public void XMethod(A a) {
Console.WriteLine(a.GetType());
Console.WriteLine("Got A");
}
public void XMethod(B b) {
Console.WriteLine(b.GetType());
Console.WriteLine("Got B");
}
}
public abstract class A {
public virtual void M(X x) {
Console.WriteLine(this.GetType());
x.XMethod(this);
}
}
public class B : A {
}
class Program {
static void Main(string[] args) {
X x = new X();
B b = new B();
b.M(x);
}
}
これの出力は
B
B
Got A
「Got A」までは大丈夫です。class のインスタンスでX.XMethod(B)
メソッドを呼び出すと、メソッドが呼び出されると思います。M
B
ここで何が起こっているのですか?提供された引数の型が であり、 ではないことが明らかな場合、 が呼び出され、 がXMethod(A)
呼び出されないのはなぜですか?XMethod(B)
B
A
PS: 同等の実装のために Java で同じ出力を得ました。