Tôi có lớp cơ sở A
phương pháp Tại sao quá tải có ưu tiên thấp hơn so với phương pháp dụ
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());
}
}
lớp tĩnh S
với phương pháp khuyến nông
public static class S
{
public static void Method(this B instance, B parameter)
{
Console.WriteLine(MethodBase.GetCurrentMethod());
}
}
Ví dụ chúng ta tạo ra ví dụ của loại B
và gọi Method
trên đó, chúng tôi hy vọng rằng nó sẽ là public override void Method(B parameter)
kết quả thực tế là public virtual void Method(object parameter)
.
var b = new B();
b.Method(new B()); // B.Method (Object parameter) Why???
Tại sao trình biên dịch không chọn phương thức phù hợp hơn ??? UPD Và tại sao nó không phải là phương pháp mở rộng?
'B' không được lồng ghép nhưng được kế thừa. –
@Henk Holterman nhờ phương thức mở rộng – user854301
không được gọi nếu đối tượng có cùng một phương thức. điều này là để tránh phá vỡ mã cũ, nơi kỳ vọng là gọi phương thức cũ và không phải là phần mở rộng mới. – Ankush