该过程与重载决策完全相同:
Func(myObject);
Run Code Online (Sandbox Code Playgroud)
编译器检查名为"Func"的所有函数,并尝试将myObject的静态类型与参数匹配(可能使用转换,向上转换为基类).如果成功,则调用适当的函数.
如果您意识到可以"以正常方式"调用扩展方法,那么它会清除:
static class MyExtensions
{
public static void MyFunc(this string arg)
{
// ...
}
}
string a = "aa";
MyExtensions.MyFunc(a); // OK
a.MyFunc(); // same as above, but nicer
Run Code Online (Sandbox Code Playgroud)
对于给定的类型(此处为字符串),编译器只在第一个参数上查找所有带有"this"修饰符的静态函数,并尝试匹配左侧的静态类型.(在此示例中为"a"),函数中包含参数类型.