[英]Is it valid to call c# extension methods in a static context?
我正在使用編碼的UI,正在使用擴展方法,發現了一些有趣的東西。 我有一個擴展方法
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);
而且編譯器沒有抱怨。 我只是好奇,此用法是否有效,還是會出現運行時錯誤?
這就是擴展方法在后台工作的方式,在編譯時,其實例查找調用將轉換為靜態方法調用。
不會有任何運行時錯誤。
請參閱: 擴展方法(C#編程指南)
在您的代碼中,您將使用實例方法語法調用擴展方法。 但是,編譯器生成的中間語言(IL)將您的代碼轉換為對靜態方法的調用。
擴展方法只不過是靜態類內部的靜態方法,當第一個參數以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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.