2011-08-02 75 views

回答

7

你不應該感到驚訝 - 運營商定製不覆蓋什麼,他們超載 - 所以他們在編譯時採摘,不執行時間

當我們從代碼中刪除隱式類型,這使得它更清楚一點:

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; 

現在轉換被應用在動態值,這意味着什麼轉換的選擇使用被推遲到執行時間 - 此時它將使用您的自定義操作符。

+0

謝謝喬恩,你的帖子對我來說非常有用! – Alex

3

您已創建B。然後將它投射到A

儘管具有相似的佈局,B具有沒有關係到A.靜態運營商通過編譯被施加,但不是通過流延在運行時。儘管C#語法是相同的,但在處理反射時它們是非常不同的。

這是正常的,預期的行爲。

+0

謝謝馬克,這對我來說確實是新的。我也發現埃裏克Lippert回答類似的問題http://stackoverflow.com/questions/2090092/is-there-a-way-to-do-dynamic-implicit-type-casting-in-c – Alex

1

你可以簡單地改變這一行:

var bInstanceReflection = Activator.CreateInstance(typeof (B)); 

要:

var bInstanceReflection = (B)Activator.CreateInstance(typeof (B)); 

所以編譯器現在知道bInstanceReflection的類型,並且可以調用正確的implitic操作。

相關問題