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# 泛型有所帮助。
【编辑推荐】