Почему универсальный метод выбирается, когда существует неуниверсальный метод?

Программа ниже производит этот вывод:

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();
        }
    }
}

Ответы на вопрос(3)

Ваш ответ на вопрос