7
A
回答
5
這更多的是比回答的觀察,但是...
當你調用一個實例方法,對您所呼叫被壓入堆棧作爲第一個參數的對象的引用您的方法調用。第一個論點是「這個」,並且是隱含的。
當你定義一個擴展方法時,你明確地定義了一個「this」作爲第一個參數。
有沒有可能是方法決議將是混亂的,如果你能定義擴展方法和在同一類實例方法,即定義具有相同名稱的方法,並在實際上,相同的參數時,「這個」參數包括在內。
1
因爲規範是這麼說的......現在可能有很好的理由爲什麼他們這樣寫規格。
他們不能在泛型類中聲明的原因很明顯:給定擴展方法的調用方式,你會在哪裏指定類的類型參數?
它必須是靜態類的原因不太明顯,但我認爲它是有道理的。靜態類的主要用例是將輔助方法組合在一起(例如,Path
,Directory
,ProtectedData
...),並且擴展方法基本上是輔助方法。例如,創建Enumerable
或Queryable
的實例是沒有意義的。
3
看看這片在.NET C#規格:
當一個方法的第一個參數包括該改性劑,該方法 被說成是一個擴展方法。擴展方法只能在非泛型非嵌套靜態類中聲明 。擴展方法的第一個參數 可以不包含 this以外的其他修飾符,並且參數類型不能是指針類型。
而這個片段來自Jon Skeet's answer:
這不是很清楚,我爲什麼所有的這些限制是必要的 - 除了潛在的編譯器(和語言規範)的簡單性。 I 可以明白爲什麼將其限制爲非泛型類型是有意義的,但是我不能立即明白爲什麼它們必須是非嵌套和靜態的。我想 懷疑它使查找規則相當簡單,如果你不 不得不擔心當前類型等內包含的類型,但我敢說這是可能的。
相關問題
- 1. 擴展方法必須在非泛型靜態類中定義
- 2. 擴展方法必須在C#中的非泛型靜態類中定義
- 3. 如何解決'擴展方法必須在非泛型靜態類中定義'?
- 4. 錯誤:擴展方法必須定義在頂級靜態類(CS1109)
- 5. 擴展方法必須在非泛型靜態類
- 6. 擴展方法必須在非泛型靜態類
- 7. 爲什麼我必須使用「this」從擴展類中調用擴展方法?
- 8. 方法必須在非泛型靜態類中定義
- 9. 爲什麼我無法爲靜態類創建擴展方法?
- 10. 擴展方法擴展靜態類
- 11. 什麼時候必須爲IEnumerable擴展方法指定類型<T>?
- 12. 爲什麼必須在C++類定義中聲明一個方法?
- 13. 擴展方法必須在非泛型靜態類中定義,同時延長任務
- 14. 爲什麼只能在靜態類中定義暴露方法?
- 15. 爲什麼ClassInitialize方法必須是靜態的?
- 16. 爲什麼我必須在引用類中定義引用類的方法?
- 17. C++ - 是否必須定義所有靜態類方法,即使未使用?
- 18. 什麼時候必須要在C++類中定義析構函數,爲什麼?
- 19. 如何在C#中擴展靜態類#
- 20. C++派生類型必須定義靜態constexpr
- 21. 擴展方法vs靜態工具類
- 22. 靜態方法與類擴展android.app.Application?
- 23. 擴展方法和靜態方法有什麼區別?
- 24. 如何在VB.NET中爲靜態類編寫方法擴展?
- 25. 爲什麼你必須在Android開發中'擴展活動'?
- 26. 爲什麼C#運算符重載必須是靜態的?
- 27. 嵌套在靜態類中的類中的擴展方法
- 28. 爲什麼.Net WPF DependencyProperties必須是類的靜態成員
- 29. 爲什麼動態類型的擴展方法無法解決?
- 30. 爲什麼必須在類中使用__iter __()方法?
我在問這個問題之前全面搜索靜態類的案例,我還沒有找到你所說的答案。順便說一下,這不是完全相同的問題,我的答案沒有在該文章中找到。 – Mehran
這是一個*精確*重複的「爲什麼不可能在泛型靜態類中聲明擴展方法?」。 –
這不是重複的。而不是所謂的雙重問題中的一個更具體的問題。 –