我正在使用编码用户界面,正在玩扩展方法,并发现了一些有趣的东西。我有一个扩展方法
public static bool Click (this UITestElement Element)
{//Code to Click Element and log any errors to framework logger}
我后来没想到用另一种方法调用
UITestElement Element = new UITestElement();
//Code to located element
Click(Element);
编译器并没有抱怨。我只是很好奇,这个用法有效,还是会出现运行时错误?
答案 0 :(得分:3)
这是扩展方法在后台工作的方式,在编译时它们的实例外观调用被转换为静态方法调用。
不会有任何运行时错误。
请参阅:Extension Methods (C# Programming Guide)
在您的代码中,您使用实例方法调用扩展方法 句法。 然而,由中间语言(IL)生成 编译器将您的代码转换为静态方法的调用。
答案 1 :(得分:2)
扩展方法只不过是静态类中的静态方法,当第一个参数以this
为前缀时,它们在编译时绑定到实例方法调用。您仍然可以将它们视为静态类上的静态方法,就像其他任何方法一样。因此,这将有效。
一个例子。鉴于此代码:
void Main()
{
int i = 0;
i.Foo();
}
public static class IntExtensions
{
public static int Foo(this int i)
{
return i;
}
}
编译器将发出以下IL(关闭优化):
IL_0000: nop
IL_0001: ldc.i4.0
IL_0002: stloc.0 // i
IL_0003: ldloc.0 // i
IL_0004: call IntExtensions.Foo
IL_0009: pop
IL_000A: ret
如您所见,调用方法的实际指令(IL_0004)会向实际静态类的静态方法发出call
。