¿Por qué se elige un método genérico cuando existe uno no genérico?

El siguiente programa produce esta salida:

Foo<T> called

Process is terminated due to StackOverflowException.

Entonces,Foo(baz) llama al genéricoFoo<T>, peroBar(baz) recurre y haceno llamadaBar<T>.

Estoy en C # 5.0 y Microsoft .NET. El compilador parece elegir el método genérico, en lugar de la recursividad, cuando el método no genérico es unoverride.

¿Dónde puedo encontrar una explicación para esta regla? (Supuse que el compilador elegiría la recursividad en ambos casos).

Aquí está el programa en su totalidad:

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta