C#编译器如何实现扩展方法?
这个过程与重载解析完全相同:
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
对于给定的类型(这里是字符串),编译器只会查找所有第一个参数带有“this”修饰符的静态函数,并尝试将左侧的静态类型(在本例中为“a”)与函数中的参数类型匹配。
类的实例方法有一个隐藏参数。例如:
class Example {
public void Foo(int arg) {}
}
在JIT编译器完成后,实际上它的样子是这样的,转换回C#语法:
static void Foo(Example this, int arg) {}