C#函数重载规则

TK.*_*TK. 9 c# clr overloading

有关函数重载的规则是什么?

我有以下代码:

public T genericFunc<T>() where T : Component, new()
{
    T result = new T();
    overloadedFunction( result );
}

private overloadedFunction ( Component c ) // catch all function

private overloadedFunction ( DerivedFromComponent dfc) // specific function
Run Code Online (Sandbox Code Playgroud)

当我用以下代码调用上面的代码时:

genericFunc<DerivedFromComponent>();
Run Code Online (Sandbox Code Playgroud)

我希望调用更具体的overloadedFunction,但是会调用catch all函数,为什么会这样?单步执行上面的代码时,类型T确实是DerivedFromComponent,我认为CLR在运行时选择了最佳匹配!

Jon*_*eet 15

编译器在编译genericFunc 该方法时执行重载解析.此时它不知道你要提供什么类型的参数,所以它只知道它可以调用你的第一个重载.

使用泛型的示例会使生活变得更复杂,但重载总是在编译时解决(假设您没有使用dynamic).

一个不使用泛型的简单示例:

void Foo(string text) { }
void Foo(object o) {}
...
object x = "this is a string";
Foo(x);
Run Code Online (Sandbox Code Playgroud)

会调用第二个重载,因为编译时类型x只是对象.

有关这方面的更多信息,请阅读我最近关于重载的文章.