在静态上下文中调用c#扩展方法是否有效?

时间:2015-08-12 14:49:23

标签: c# extension-methods coded-ui-tests

我正在使用编码用户界面,正在玩扩展方法,并发现了一些有趣的东西。我有一个扩展方法

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);

编译器并没有抱怨。我只是很好奇,这个用法有效,还是会出现运行时错误?

2 个答案:

答案 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