C# 強制類型轉換與C# 泛型淺析
C# 強制類型轉換和普通對象一樣,泛型類的對象也可以采用強制類型轉換轉換成另外的泛型類型,不過只有當兩者在各個方面兼容時才能這么做。C# 編譯器只允許將一般類型參數隱式強制轉換到 Object 或約束指定的類型,如下面代碼塊所示。這樣的隱式強制類型轉換是類型安全的,因為可以在編譯時發現任何不兼容性。
C# 強制類型轉換與C# 泛型實例演示:
代碼塊
一般類型參數的隱式強制類型轉換
- interface ISomeInterface
- {...}
- class BaseClass
- {...}
- class MyClass where T : BaseClass,ISomeInterface
- {
- void SomeMethod(T t)
- {
- ISomeInterface obj1 = t;
- BaseClass obj2 = t;
- object obj3 = t;
- }
- }
編譯器允許您將一般類型參數顯式強制轉換到其他任何接口,但不能將其轉換到類:
- interface ISomeInterface
- {...}
- class SomeClass
- {...}
- class MyClass
- {
- void SomeMethod(T t)
- {
- ISomeInterface obj1 = (ISomeInterface)t;//Compiles
- SomeClass obj2 = (SomeClass)t; //Does not compile
- }
- }
但是,您可以使用臨時的 Object 變量,將一般類型參數強制轉換到其他任何類型:
- class SomeClass
- {...}
- class MyClass
- {
- void SomeMethod(T t)
- {
- object temp = t;
- SomeClass obj = (SomeClass)temp;
- }
- }
不用說,這樣的顯式強制類型轉換是危險的,因為如果為取代一般類型參數而使用的類型實參不是派生自您要顯式強制轉換到的類型,則可能在運行時引發異常。要想不冒引發強制類型轉換異常的危險,一種更好的辦法是使用 is 和 as 運算符,如代碼塊 6 所示。如果一般類型參數的類型是所查詢的類型,則 is 運算符返回 true;如果這些類型兼容,則 as 將執行強制類型轉換,否則將返回 null。您可以對一般類型參數以及帶有特定類型實參的一般類使用 is 和 as。
C# 強制類型轉換與C# 泛型實例:
代碼塊
對一般類型參數使用“is”和“as”運算符
- 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# 強制類型轉換與C# 泛型相關的內容就向你介紹到這里,希望對你了解和學習C# 強制類型轉換與C# 泛型有所幫助。
【編輯推薦】