RuntimeBinderException
在C#中,我們經常需要在不修改原始原始碼的情況下為現有類別新增方法。擴展方法正是為了滿足這種需求而引入的。
考慮一個整數列表,使用First()
方法存取第一個元素:
<code class="language-csharp">List<int> list = new List<int>() { 5, 56, 2, 4, 63, 2 }; Console.WriteLine(list.First());</code>
這段程式碼運行完美。但是,如果嘗試使用dynamic
關鍵字將相同的列表轉換為動態對象,則會引發異常:
<code class="language-csharp">dynamic dList = list; Console.WriteLine(dList.First()); // 抛出 RuntimeBinderException</code>
要理解這種異常行為,我們需要深入了解擴展方法的底層機制。在非動態程式碼中,編譯器會在所有已知類別中搜尋提供匹配擴展方法的靜態類別。此搜尋遵循命名空間嵌套順序和可用的using
指令。
當呼叫動態擴充方法時,動態語言執行階段 (DLR) 會遇到一個挑戰。它必須在運行時確定原始程式碼中存在的命名空間嵌套和using
指令。但是,沒有方便的機制可以將此資訊編碼到呼叫站點。雖然曾考慮設計這種機制的可能性,但最終認為實現成本過高且風險太大。
以上是為什麼動態擴充方法在 C# 中拋出 RuntimeBinderException?的詳細內容。更多資訊請關注PHP中文網其他相關文章!