c# 理解轉換操作符

  系統內建類型支持一些內建轉換,如一個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;
        }
    }

你可能感兴趣的:(操作符)