[英]Un Boxing a class object - No Error?
可能我會對裝箱和拆箱感到困惑。
考慮以下來自MSDN的聲明:
“拆箱是從類型對象到值類型或從接口類型到實現接口的值類型的顯式轉換。”
因此,這意味着拆箱只能應用於值類型參數。
這樣就可以了
var concernedInteger = (int)myObject; //unboxing is ok.
由於類是引用類型,因此這不起作用(因為取消裝箱僅適用於值類型)
var concernedClassObject = (TestClass)testClassObject // unboxing is still ok.
我的ReSharper沒有顯示任何錯誤。
因此,我的問題是“當MSDN說只能將值類型拆箱時,如何拆箱引用類型變量”?
這不是拆箱。 它是type casting
。
取消裝箱會將值從引用中拉出為值類型(假設強制轉換將成功)。 當您像這樣移動引用類型時,它只是普通的類型轉換。
裝箱和拆箱都是類型轉換的type casting
。 之所以給它們指定特殊名稱(裝箱和拆箱),是因為在托管環境中發生了更多的事情,而不只是更改了幾個查找表。 這就是為什么將它們分為值類型的裝箱和拆箱這兩個術語的原因。但是,對於引用類型,這只是類型轉換。
您在這里所做的是TypeCasting
而不是裝箱/拆箱。 但是,拆箱和顯式引用轉換都使用相同的轉換語法
裝箱和拆箱:
Boxing
和unboxing
進場當你施放值類型和引用類型,基本對象
一個簡單的boxing
和unboxing
示例將是
int i=1;
object o=i; /// This is boxing
int j = (int)o; /// This is unboxing
類型投放:
類型轉換導致轉換。 類型轉換將表達式顯式轉換為給定類型。
(type) expression
將expression
轉換為type type
的對象。 讓我們考慮例子
long _longval = 1;
int i = (int)_longval
顯式強制轉換實際上告訴編譯器我們知道可能的信息丟失,但是仍然需要執行強制轉換。 對於內置的數字類型來說這是可以的,但是在引用類型中它可能根本不兼容。例如
string _mystring="abc";
int i=(int)_mystring;
這樣的轉換表達式將成功編譯,但在運行時會失敗,並給出InvalidCastException錯誤。
使用As關鍵字:
例
MyClass _MyObject = (MyClass ) obj;
MyClass MyObject = obj as MyClass ;
當強制轉換在代碼的第一行失敗時,將引發異常,而在第二行中,您將僅獲得空值。此外,您只能將其與引用類型一起使用,因此對於值類型,您只能使用常規的強制轉換方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.