C# 強(qiáng)制類型轉(zhuǎn)換與C# 泛型淺析
C# 強(qiáng)制類型轉(zhuǎn)換和普通對(duì)象一樣,泛型類的對(duì)象也可以采用強(qiáng)制類型轉(zhuǎn)換轉(zhuǎn)換成另外的泛型類型,不過(guò)只有當(dāng)兩者在各個(gè)方面兼容時(shí)才能這么做。C# 編譯器只允許將一般類型參數(shù)隱式強(qiáng)制轉(zhuǎn)換到 Object 或約束指定的類型,如下面代碼塊所示。這樣的隱式強(qiáng)制類型轉(zhuǎn)換是類型安全的,因?yàn)榭梢栽诰幾g時(shí)發(fā)現(xiàn)任何不兼容性。
C# 強(qiáng)制類型轉(zhuǎn)換與C# 泛型實(shí)例演示:
代碼塊
一般類型參數(shù)的隱式強(qiáng)制類型轉(zhuǎn)換
- interface ISomeInterface
- {...}
- class BaseClass
- {...}
- class MyClass where T : BaseClass,ISomeInterface
- {
- void SomeMethod(T t)
- {
- ISomeInterface obj1 = t;
- BaseClass obj2 = t;
- object obj3 = t;
- }
- }
編譯器允許您將一般類型參數(shù)顯式強(qiáng)制轉(zhuǎn)換到其他任何接口,但不能將其轉(zhuǎn)換到類:
- interface ISomeInterface
- {...}
- class SomeClass
- {...}
- class MyClass
- {
- void SomeMethod(T t)
- {
- ISomeInterface obj1 = (ISomeInterface)t;//Compiles
- SomeClass obj2 = (SomeClass)t; //Does not compile
- }
- }
但是,您可以使用臨時(shí)的 Object 變量,將一般類型參數(shù)強(qiáng)制轉(zhuǎn)換到其他任何類型:
- class SomeClass
- {...}
- class MyClass
- {
- void SomeMethod(T t)
- {
- object temp = t;
- SomeClass obj = (SomeClass)temp;
- }
- }
不用說(shuō),這樣的顯式強(qiáng)制類型轉(zhuǎn)換是危險(xiǎn)的,因?yàn)槿绻麨槿〈话泐愋蛥?shù)而使用的類型實(shí)參不是派生自您要顯式強(qiáng)制轉(zhuǎn)換到的類型,則可能在運(yùn)行時(shí)引發(fā)異常。要想不冒引發(fā)強(qiáng)制類型轉(zhuǎn)換異常的危險(xiǎn),一種更好的辦法是使用 is 和 as 運(yùn)算符,如代碼塊 6 所示。如果一般類型參數(shù)的類型是所查詢的類型,則 is 運(yùn)算符返回 true;如果這些類型兼容,則 as 將執(zhí)行強(qiáng)制類型轉(zhuǎn)換,否則將返回 null。您可以對(duì)一般類型參數(shù)以及帶有特定類型實(shí)參的一般類使用 is 和 as。
C# 強(qiáng)制類型轉(zhuǎn)換與C# 泛型實(shí)例:
代碼塊
對(duì)一般類型參數(shù)使用“is”和“as”運(yùn)算符
- public class MyClass
- {
- public void SomeMethod(T t)
- {
- if(t is int)
- {...}
- if(t is LinkedList)
- {...}
- string str = t as string;
- if(str != null)
- {...}
- LinkedList list = t as LinkedList;
- if(list != null)
- {...}
- }
- }
C# 強(qiáng)制類型轉(zhuǎn)換與C# 泛型相關(guān)的內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C# 強(qiáng)制類型轉(zhuǎn)換與C# 泛型有所幫助。
【編輯推薦】