Il programma di seguito produce questo output:Perché è un metodo generico scelto quando esiste un non generico?
Foo<T> called
Process is terminated due to StackOverflowException.
Quindi, Foo(baz)
chiama il generico Foo<T>
, ma Bar(baz)
recurses e fa non chiamata Bar<T>
.
Sono su C# 5.0 e Microsoft .NET. Il compilatore sembra scegliere il metodo generico, invece della ricorsione, quando il metodo non generico è un override
.
Dove posso trovare una spiegazione per questa regola? (avevo intuito che il compilatore avrebbe scelto la ricorsione in entrambi i casi.)
Ecco il programma nella sua interezza:
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();
}
}
}
Mi piace visualizzare tutte queste situazioni come il modo in cui i creatori del compilatore ti puniscono per l'utilizzo dell'ereditarietà ... –
Sembra che venga data priorità al metodo non sottoposto a override nella classe figlia rispetto al metodo sottoposto a override in la classe del bambino; può trattare il metodo sottoposto a override come parte del genitore. – adamdc78