6

在DLR的LINQ表達式,也正是這一區別:轉換和拆箱有什麼區別?

Expression.Convert(SomeVariableExpression, typeof(T)); 

這:

Expression.Unbox(SomeVariableExpression, typeof(T)); 

這個文檔似乎有點粗略。

而且更重要的是,這其中的一個就相當於這個C#代碼:

(ClassA)InstanceOfClassB 

ClassB的地方有一個隱性或顯性的運營商轉換爲ClassA的?

+1

對不起,這是雙張貼。我已經刪除了另一個。 :-) – 2009-06-09 17:33:32

+0

見[這個問題](http://stackoverflow.com/q/32158399/1127114),用於當它是需要使用的,而不是轉換的Unbox的一個具體例子。 – 2015-08-23 20:45:31

回答

3

井主要區別在於Epression.Unbox只需要一個值的明確的取消裝箱鍵入斷堆。 Expression.Convert是您希望用於掛接到用戶定義轉換(無論是隱式還是顯式)的方法。

參見Expression.Convert

如果任expression.Type或類型是 ,其限定 隱式或顯式轉換 操作者一個用戶定義的類型,這MethodInfo 表示操作者是 實現方法。

和也:

如果任expression.Type或類型是 引用類型和明確的拳擊, 拆箱,或引用轉換 從expression.Type存在打字, 各執行方法是 null。

1

Expression.Convert是在做類型轉換的等價物。

2

一般而言,拳擊取值類型並把它封裝在一個對象。拆箱正好相反。你可以認爲這是因爲裝箱需要一個寄存器或棧值,並將其放在堆上,並返回一個指向該值的指針。拆箱需要堆上的對象並將其放入寄存器或堆棧框架中。基礎數據類型保持不變。

轉換改變一個數據類型到另一個。

4

重要的是拆箱,它給你的裝箱值的地址。這可確保您可以調用取消裝箱值的方法。如果該方法突變了值類型,那麼它會改變盒裝版本而不是新副本。如果你只是做了轉換,那麼你實際上已經制作了盒裝值類型的副本,然後調用它的方法會改變副本而不是原始值。