回答
你不應該感到驚訝 - 運營商定製不覆蓋什麼,他們超載 - 所以他們在編譯時採摘,不執行時間。
當我們從代碼中刪除隱式類型,這使得它更清楚一點:
object bInstanceReflection = Activator.CreateInstance(typeof (B));
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B
A aInstanceReflection = (A) bInstanceReflection;
現在是相當清楚的是,在最後一行,(A)
距離object
鑄造執行正常參考值轉換。根本不會應用用戶定義的轉換。
如果您使用.NET 4,你可以使用動態類型來得到它的工作:
// Note the change of type
dynamic bInstanceReflection = Activator.CreateInstance(typeof (B));
Console.WriteLine(bInstanceReflection.GetType()); // <assemblyname>.B
A aInstanceReflection = (A) bInstanceReflection;
現在轉換被應用在動態值,這意味着什麼轉換的選擇使用被推遲到執行時間 - 此時它將使用您的自定義操作符。
謝謝喬恩,你的帖子對我來說非常有用! – Alex
您已創建B
。然後將它投射到A
。
儘管具有相似的佈局,B具有沒有關係到A.靜態運營商通過編譯被施加,但不是通過流延在運行時。儘管C#語法是相同的,但在處理反射時它們是非常不同的。
這是正常的,預期的行爲。
謝謝馬克,這對我來說確實是新的。我也發現埃裏克Lippert回答類似的問題http://stackoverflow.com/questions/2090092/is-there-a-way-to-do-dynamic-implicit-type-casting-in-c – Alex
你可以簡單地改變這一行:
var bInstanceReflection = Activator.CreateInstance(typeof (B));
要:
var bInstanceReflection = (B)Activator.CreateInstance(typeof (B));
所以編譯器現在知道bInstanceReflection的類型,並且可以調用正確的implitic操作。
- 1. 使用通用類型和隱式轉換的反射
- 2. 反射中的隱式類型轉換
- 3. 使用類型轉換操作符
- 4. 重載顯式類型轉換操作符
- 5. 通過反射獲取顯式演員操作
- 6. 通過反射設置屬性時的類型轉換問題
- 7. 實例化通過反射泛型類/類型名稱
- 8. 屬性編輯器不適用於類型轉換,但字符串操作
- 9. 德爾福IS操作符 - 操作符不適用於此操作數類型
- 10. 通過反射和隱式轉換創建通用列表
- 11. 演員對象類型值轉換成一個類型,通過反射
- 12. C++/CLI類型轉換操作符
- 13. c-style類型轉換和操作符()
- 14. 通過反射實例化泛型
- 15. 隱式操作符轉換和泛型
- 16. Java`InvocationTargetException`通過反射類實例化
- 17. 模板化的操作符實例化和類型轉換
- 18. 使用反射基於參數類型轉換值
- 19. 如何按返回類型過濾EF過程(例如,通過反射或IL)?
- 20. 通過反射檢測可空類型
- 21. 通過反射繼承類型
- 22. 是否可以通過反射調用值類型運算符?
- 23. 使用反射/類型轉換將C#數組轉換爲字符串
- 24. 使用反射動態顯式轉換Java中的原始類型
- 25. 如何通過反射獲得通用參數的類型
- 26. ObservableArrayList:如何通過反射獲取通用類型?
- 27. 如何從反射執行顯式操作投射?
- 28. 通過反射創建泛型類的實例
- 29. 通過反射確定類型是否爲單例
- 30. 協方差/反變換適用於不實現通用接口的隱式可轉換類型嗎?
什麼是異常消息? –