class Program
{
static void Main(string[] args)
{
//1、類型轉換
{
//隐式轉換:不需要轉型,因為new傳回一個Employee對象,而Object是Employee的基類型
object o = new Employee();
//顯示轉換:需要轉型,因為Employee派生自Object
Employee employee = (Employee)o;
}
//2、類型安全
{
//由于Manager是派生自Employee類型,運作正常
Manager m = new Manager();
PromoteEmployee(m);
//由于DateTime不是派生自Employee類型,運作時會抛出異常
//DateTime newYears = new DateTime(2019, 8, 25);
//PromoteEmployee(newYears);
}
//3、類型檢查 is ,用is判斷類型相比比較低
/*
* 這是由于is操作符首先核實o是否相容于Employee類型,再次核實o是否引用了一個Employee
*
* is類型檢查,永遠不會抛出異常,結果隻會傳回 true 或 false
*
* **/
{
object o = new object();
if ((o is object))
{
}
if ((o is Employee))
{
}
}
//4、類型轉換 as ,用as判斷類型可提升其性能
/*
* as 類型轉換,如果類型轉換成功,則傳回對象,否則傳回null,此轉換方式也永遠不會抛出異常
*
* **/
{
object o = new object();
Employee e = o as Employee;
if (e != null)
{
}
}
//5、類型轉行 as ,測試
{
object o = new object();
Employee e = o as Employee;
}
//6、類型轉換小測試
{
//編譯錯誤,由于是顯示轉換,不一定成功
//B b1 = new object();
//D d1 = new object();
//運作錯誤,由于是顯示轉換,不一定成功
B b1 = new B();
D d1 = (D)b1;
//運作錯誤,由于是顯示轉換,不一定成功
object o = new object();
B b2 = (B)o;
}
Console.ReadKey();
}
//應該将Object參數類型改為Employee類型,這樣在編譯時就能報錯
static void PromoteEmployee(object o)
{
Employee e = (Employee)o;
}
}
class D : B
{
}
class B
{
}
public class Manager : Employee
{
}
public class Employee
{
}