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只是对象.
有关这方面的更多信息,请阅读我最近关于重载的文章.