阿宽

Nothing is more powerful than habit!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

c# 理解轉換操作符

Posted on 2007-11-13 16:00  宽田  阅读(328)  评论(0编辑  收藏  举报
  系統內建類型支持一些內建轉換,如一個int可以隱式地轉換成一個double。
那我們如何將自己定義的類或結構等轉換為指定的類型呢?
如下例子中調用example.MyIntMethod(lunch)方法時,example.MyIntMethod的方法傳的參數為int型,但實際傳入的參數為Hour,此時需要進行轉換,轉換方法為調用Hour結構中的轉換操作符。
        struct Hour
        {
            
public int iValue;
            
//構造函數
            public Hour(int initialValue)
            {
                
this.iValue = initialValue;
            }
            
/// <summary>
            
/// 聲明轉換操作符,允許一個Hour對像隱式地轉換成一個INT
            
/// </summary>
            
/// <param name="from">需要轉換的類型的參數</param>
            
/// <returns></returns>
            /*注: 
                 聲明轉換操作符時,來源類型要聲明成一個參數(本例是Hour)
                 目標類型則聲明為關鍵operator之后的類型名稱(本例是int),關鍵字operator之前不要指定返回類型。
                 聲明自己的轉換操作符時,必須指定它們是隱式的轉換操作符,還是顯式的轉換操作符。用implicit和exlpicit關鍵字來指定
            
*/
            
public static implicit operator int(Hour from)
            {
                
return from.iValue;
            }
        }

        
//定義一個類
        class example
        {
            
public static void MyIntMethod(int parameter)
            {
            }
        }

        
static void Main(string[] args)
        {
            Hour lunch 
= new Hour(12);
            
//example.MyIntMethod的方法傳的參數要示為int型,但實際傳入的參數為Hour,此時需要進行轉換,轉換方法為調用Hour結構中的轉換操作符
            
//隱式轉換,將lunch轉換成int型
            example.MyIntMethod(lunch);
        }

那什麼時候應該聲明為顯式,在什麼時候應該聲明為隱式?
如果轉換總是安全的,沒有丟失信息的風險,而且不能拋出異常,就可以把聲明為隱式轉換。否則應該聲明為顯教轉換。

為了加深對轉換操作符的理解,下邊舉個例子:
    class Program
    {
        
/*
         * 此例中,我們定只義了Hour+Hour的操作符重載。但沒有定義Hour+int和int+hour的重載操作符。
         * 但我們定義了一個轉換操作符,當調用Hour+int和int+hour的重載操作符時,轉換操作符就會將int型的轉換Hour。
         
*/
        
struct hour
        {
            
private int iValue;
            
public hour(int initialValue)
            {
                
this.iValue = initialValue;
            }
            
//聲明重載操作符,為Hour+Hour
            public static hour operator +(hour lhs, hour rhs)
            {
                
return new hour(lhs.iValue + rhs.iValue);
            }
            
//聲明轉換操作符,將int型轉換為Hour
            public static implicit operator hour(int from)
            {
                
return new hour(from);
            }
        }

        
static void Main(string[] args)
        {
            
//實例化Hour變量a
            hour lhs = new hour(2);
            
//實例化Hour變量b
            hour rhs = new hour(3);
            
//調用重載操作符。此時lhs與rhs都為Hour
            hour hrSum = lhs + rhs;
            
//調用重載操作符,並調用轉換操作符。因為11為int型,而實例子傳入的參數為hour,所需要轉換。
            hour hrSumInt = lhs + 11;
            
//調用重載操作符,並調用轉換操作符。因為15為int型,而實例子傳入的參數為hour,所需要轉換。
            hour hrSumInt = 15 + rhs;
        }
    }