Tip3 区别对待强制转型as和is
如果类型之间都上溯到了某个共同的基类,那么根据此基类进行的转型应该使用as。子类于子类之间的转型,则应该提供转型操作符,以便进行强制转型
class FirstType
{
public string Name { get; set; }
}
class SecondType
{
public string Name { get; set; }
public static explicit operator SecondType(FirstType firstType)
{
SecondType secondType = new SecondType() { Name = "转型自:" + firstType.Name };
return secondType;
}
}
FirstType firstType = new FirstType() { Name = "First Type" };
SecondType secondType = (SecondType)firstType; //转型成功
//secondType = firstType as SecondType; //编译期转型失败,编译不通过
static void DoWithSomeType(object obj)
{
//SecondType secondType = (SecondType)obj;//若传入参数为FirstType对象,会引发异常
//因为编译器运行时会检查obj是不是SecondType,绕过了转换操作符
SecondType secondType = obj as SecondType;
if (secondType != null)
{
// do someting
}
}
若FirstType是SecondType的基类,则as和强转都可以用
//is的用法
static void DoWithSomeType(object obj)
{
if (obj is SecondType)
{
SecondType secondType = obj as SecondType;
//do something
}
}