4. 泛型和强制类型转换
4.1 C#编译器只允许将泛型参数隐式强制转换到Object或约束指定的类型
interface ISomeInterface
{ ……}
class BaseClass
{……}
class MyClass<T> where :BaseClass ,ISomeInterface
{
void SomeMethod(T t)
{
//类型安全的,编译时检查
ISomeInterface obj1=t;
BaseClass obj2=t;
object obj3=t
}
}
4.2 编译器允许你将泛型参数显示强制转换到其他任何接口,但不能将其转换到类
interface ISomeInterface
{ ……}
class SomeClass
{……}
class MyClass<T>
{ 软件开发网 www.mscto.com
void SomeMethod(T t)
{
ISomeInterface obj1=(ISomeInterface)t; //complies
SomeClass obj2=(SomeClass)t; //Does not complies
}
}
但是,使用临时的 Object 变量,将泛型参数强制转换到其他任何类型
class SomeClass
{……}
class MyClass2<T>
{
void SomeMethod(T t)
{
软件开发网 www.mscto.com
object temp = t;
SomeClass obj = (SomeClass)temp;
}
}
4.2 不用说强制转换时危险的,因为如果为取代泛型参数而使用的类型参数不是派生自你要显示强制转换到的类型,则可能引发异常。 软件开发网 www.mscto.com
解决强制类型转换的方法:使用is和as运算符
public class MyClass3<T>
{
public void SomeMethod(T t)
{ 软件开发网 www.mscto.com
//如果泛型参数的类型是所查询的类型,则is运算符返回true
if (t is int) { }
if (t is LinkedList<int, string>) { }
软件开发网 www.mscto.com
string str = t as string; 软件开发网 www.mscto.com
if (str != null) { }
LinkedList<int, string> list = t as LinkedList<int, string>;
if (list != null) { }
} 软件开发网 www.mscto.com
}