【发布时间】:2015-09-17 21:34:50
【问题描述】:
下面的程序产生这个输出:
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();
}
}
}
【问题讨论】:
-
我喜欢将所有此类情况视为编译器创建者惩罚您使用继承的方式......
-
似乎子类中的非覆盖方法优先于子类中的覆盖方法;它可能会将被覆盖的方法视为父方法的一部分。
标签: c# generics overloading overload-resolution