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
}
}