Почему универсальный метод выбирается, когда существует неуниверсальный метод?
Программа ниже производит этот вывод:
Foo<T> called
Process is terminated due to StackOverflowException.
Так,Foo(baz)
называет родовымFoo<T>
, ноBar(baz)
рекурсивно и делаетне вызовBar<T>
.
Я на C # 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();
}
}
}