Программа ниже производит этот вывод:
Foo<T> called
Process is terminated due to StackOverflowException.
Итак, Foo(baz)
вызывает общий Foo<T>
, но Bar(baz)
рекурсивно и не вызывает Bar<T>
.
Я на С# 5.0 и Microsoft .NET. Компилятор, кажется, выбирает универсальный метод вместо рекурсии, когда неуниверсальным методом является override
.
Где я могу найти объяснение этому правилу? (Я догадался, что компилятор выберет рекурсию в обоих случаях.)
Вот программа целиком:
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();
}
}
}