chương trình dưới đây tạo ra kết quả này:Tại sao một phương pháp chung được chọn khi không tồn tại chung?
Foo<T> called
Process is terminated due to StackOverflowException.
Vì vậy, Foo(baz)
gọi chung Foo<T>
, nhưng Bar(baz)
recurses và làm không gọi Bar<T>
.
Tôi đang sử dụng C# 5.0 và Microsoft .NET. Trình biên dịch dường như chọn phương thức chung, thay vì đệ quy, khi phương thức không chung chung là một override
.
Tôi có thể tìm giải thích cho quy tắc này ở đâu? (Tôi đã đoán rằng trình biên dịch sẽ chọn đệ quy trong cả hai trường hợp.)
Đây là chương trình trong toàn bộ:
using System;
namespace ConsoleApplication1 {
class Baz { }
abstract class Parent {
public abstract void Foo(Baz baz);
}
class Child : Parent {
void Bar<T>(T baz) {
Console.WriteLine("Bar<T> called");
}
public void Bar(Baz baz) {
Bar(baz);
}
void Foo<T>(T baz) {
Console.WriteLine("Foo<T> called");
}
public override void Foo(Baz baz) {
Foo(baz);
}
}
class Program {
static void Main(string[] args) {
var child = new Child();
child.Foo(null);
child.Bar(null);
Console.ReadLine();
}
}
}
Tôi thích xem tất cả các tình huống như thế này theo cách người tạo của trình biên dịch trừng phạt bạn để sử dụng thừa kế ... –
Dường như ưu tiên đang được trao cho phương thức không ghi đè trong lớp con qua phương thức ghi đè trong lớp trẻ; nó có thể điều trị phương pháp ghi đè như là một phần của phụ huynh. – adamdc78