C#編譯器如何實現擴展方法?如何編譯擴展方法?
8
A
回答
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
相關問題
- 1. 擴展方法編譯優先
- 2. 擴展方法和編譯時檢查
- 3. 如何編譯Ruby擴展
- 4. 如何編寫使用擴展方法
- 5. 如何編寫EF.Functions擴展方法?
- 6. 編譯PHP擴展
- 7. 編譯PHP擴展
- 8. Closure編譯器:如何編譯帶擴展名的Chrome擴展插件
- 9. 如何使用cython編譯擴展?
- 10. 如何編譯Emacs elisp擴展名(nXhtml)?
- 11. 如何爲Firefox編譯此擴展名?
- 12. 如何編譯PHP擴展跨版本?
- 13. 編譯錯誤編譯PHP擴展
- 14. 無法編譯PHP 5.2 mysqli擴展
- 15. 交叉編譯Python擴展
- 16. 預編譯可擴展宏
- 17. 編譯Ruby的C++擴展
- 18. 編譯windows的PHP擴展
- 19. 開始編譯PHP擴展
- 20. Collection.ToList <TResult>()擴展方法引發編譯時錯誤
- 21. C#通用擴展方法編譯但不可用?
- 22. 通用擴展方法編譯器錯誤
- 23. 擴展方法不編譯(沒有定義類型'字符串')
- 24. 火花視圖引擎預編譯和擴展方法
- 25. 用的String.Format奇怪的編譯器錯誤的擴展方法
- 26. 如何翻譯Magento擴展?
- 27. 擴展方法
- 28. 擴展方法
- 29. 如何以編程方式擴展卷
- 30. 如何從另一個php擴展方法調用php擴展方法