Tip3 區別對待強制轉型as和is

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
            }
        }
發佈了52 篇原創文章 · 獲贊 24 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章