2010-10-14 80 views

回答

6

的過程是完全相同的重載解析:

Func(myObject); 

的編譯器檢查名爲「功能」的所有功能,並嘗試匹配到parametrs(可能使用轉換的靜態類型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」),並在函數中使用參數類型。

3

類的實例方法有一個隱藏的參數。舉個例子:

class Example { 
    public void Foo(int arg) {} 
} 

其實是這樣的,當JIT編譯器是用它做,改回C#語法:

static void Foo(Example this, int arg) {} 

隱藏的說法是,你可以在使用這個的原因一個實例方法。 JIT編譯器會根據您提供的對象引用傳遞的參數來調用Foo方法。

如你所知,現在是非常短延伸到擴展方法。

0

編譯器首先查找在基類用於匹配函數的簽名的函數。如果它找不到它,它會尋找一個擴展名。如果擴展與基類方法具有相同的特徵,則將調用基類方法。

這可能有所幫助: Extension Methods