c#自定義類型的轉換方式operator,以及implicit(隱式)和explicit (顯示)聲明的區別


msdn參考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx

              http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx

              http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx

operator 關鍵字來重載內置運算符,或提供類或結構聲明中的用戶定義轉換。它可以定義不同類型之間采用何種轉化方式和轉化的結果。

operator用於定義類型轉化時可采用2種方式,隱式轉換(implicit)和顯示轉換(explicit)

一般定義方式為

public static implicit 目標類型(被轉化類型 變量參數)
{
   return 目標類型結果;
}

public static explicit 目標類型(被轉化類型 變量參數)
{
   return 目標類型結果;
}

代碼案例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 自定義裝換
{
    class Program
    {
        static void Main(string[] args)
        {
            myclass mc = 1;//通過隱式裝換,生成myclass對象
            Console.WriteLine(mc.Value);
            myclass mc2 = new myclass(2);
            Console.WriteLine((int)mc2);//顯示轉化,調用myclass至int的處理方法
            Console.WriteLine(mc2);//隱式轉化,調用myclass至string的處理方法
           
        }
    }

    class myclass
    {
        private int value;//聲明value私有字段
        public int Value//聲明只讀屬性
        {
            get { return value; }
        }
        public myclass(int value)//構造函數
        {
            this.value = value;
        }

        public static explicit operator int(myclass mc)//顯示聲明的myclass轉int類處理方法
        {
            return mc.value;
        }
        public static implicit operator myclass(int value)//隱式聲明的int轉myclass類處理方法
        {
            return new myclass(value);
        }
        public static implicit operator string(myclass mc)//隱式聲明的myclass轉string類處理方法
        {
            return ("定義的myclass類string類型轉化結果");
        }
    }

 }

結果

 

【注意】:1.轉換運算符將源類型轉換為目標類型。 源類型提供轉換運算符。 與隱式轉換不同,必須通過強制轉換的方式來調用顯式轉換運算符。 如果轉換操作可能導致異常或丟失信息,則應將其標記為 explicit。這可以防止編譯器無提示地調用可能產生無法預見后果的轉換操作。

              2.在利用implicit的隱式聲明時,注意在不明語言的情況下,存在多個由當前類轉化為其他類型數據的隱式聲明的時候,可能會出現編譯錯誤,是由於隱式聲明下,2者都可以調用,編譯器不知道選擇哪個而出現的錯誤。

              例如

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 自定義裝換
{
    class Program
    {
        static void Main(string[] args)
        {
            
            myclass mc2 = new myclass(2);
         
            Console.WriteLine(mc2);//出錯位置,編譯器無法選擇有效的類型轉化方式
           
        }
    }

    class myclass
    {
        private int value;
        public int Value
        {
            get { return value; }
        }
        public myclass(int value)
        {
            this.value = value;
        }      
        public static implicit operator myclass(int value)
        {
            return new myclass(value);
        }

        ///2個隱式聲明myclass類轉化類型的方法
        public static implicit operator int(myclass mc)
        {
            return mc.value;
        }
        public static implicit operator string(myclass mc)
        {
            return ("定義的myclass類string類型轉化結果");
        }
    }

解決方法:

1.將console.writeline()中輸出進行強制轉換,明確轉化目標,例如

Console.WriteLine((string)mc2);

2.將2個隱式轉化方法之一改為顯示,編譯器將默認調用隱式那個

        public static explicit operator int(myclass mc)//改為顯示轉化
        {
            return mc.value;
        }
        public static implicit operator string(myclass mc)
        {
            return ("定義的myclass類string類型轉化結果");
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM