首頁  >  文章  >  後端開發  >  C#學習日記16----隱式轉換特定用例

C#學習日記16----隱式轉換特定用例

黄舟
黄舟原創
2017-01-21 15:02:091691瀏覽

   經過前面的學習C#中基本的資料類型就介紹的差不多了,下面就學習下類型之間的互相轉換.C# 中類型轉換可以分為2類: 隱式轉換和顯式轉換.

隱式轉換:

         隱式轉換是系統預設的轉換,且不需要被申明轉換。在隱式轉換過程中,編譯器無需對轉換進行檢查就能夠安全的執行轉換,例如從int類型轉到long類型,就是隱式轉換。隱式轉換一般不會失敗,轉換過程中也不會遺失資訊.

   例如:int i = 100;

             轉換並非對任兩種類型都成立,例如,我們將上面的long型隱式轉換為int型別就不會成功:

              long a = 100;  編譯器會報錯

   因此隱式轉換有以下的規則:

隱式數值轉換

  • 隱式枚舉轉換

  •     隱式數值轉換包括以下幾種:
  • 從sbyte 類型到short、int、long、float、double、decimal類型;
  • 從byte 類型到short、ushort、int、uint、long、ulong、f double、decimal類型;
  • 從short 類型到int、long、flaot、double、decimal類型;

    從ushort 類型到int、uint、long、ulong、flaot、double、demal
  • 從int 類型到 long、flaot、double、decimal類型;

  • 從uint 類型到 long、ulong、flaot、double、decimal類型;

  • 從ulong 類型到 float、double、decimal類型;

    從ulong 類型到 float、double、decimal型;

  • 從char 型別到ushort、int、uint、long、ulong、flaot、double、decimal;

  •      寫了這麼多總結下吧,概括的說就是從低精度類型到高精度類型轉換(因為不丟失精度與數據信息),而從高精度類型到低精度不能隱式轉換(可能會丟失部分訊息,不安全)。有關類型的精確度與範圍請參考 C#學習日記04 。這裡要提醒的是 不存在其他類型到Char類型的隱式轉換。

     
  • 隱式數值轉換實例:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Test  
    {    
        class Program  
        {  
            static void Main(string[] args)  
            {  
                byte x = 255;      //byte 表示的范围0~255  
                short y = x;      //将从byte到short隐式转换  
                y++;  
                Console.WriteLine("y = {0}",y);  
      
                y = 32767; //shot的范围 -32768~32767  
      
                int i = y + 5;  //从 short 到 int 隐式转换扩大范围 结果是准确的  
                y+=5;          //超出范围了结果会不准确  
                Console.WriteLine("y = {0}",y); //y超出范围数据会丢失部分  
                  
                Console.WriteLine("i = {0}",i);   
      
                  
            }  
        }  
    }

    結果:
  • 從這個例子可以看出,及時的採用類型轉換還是很重要噠。
  •  

  • 隱式枚舉轉換:
  •       隱式枚舉轉換允許將十進制0,轉換為任何枚舉類型,注意的是,它只能轉換0,對其他整數不存在這種隱式轉換,看下面的範例:

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Test  
    {    
        class Program  
        {  
            enum weekday  //定义一个枚举类型  
            { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };  
            static void Main(string[] args)  
            {  
                weekday day;  
                day = 0;      //隐式将0转换为枚举类型(只能是0)  
                Console.WriteLine(day);  
                  
            }  
        }  
    }
  •   輸出結果是:
  Sunday

      上面程式碼中如果我們把day = 0 該為day = 1 編譯器就會給出錯誤。

 

隱式引用轉換:

從任何引用類型到物件類型的轉換;C#學習日記16----隱式轉換特定用例

 (Person p = new Person())

  (Person p = new Person())

s是t的派生類別;

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{  
    class person     //定义了一个基类(父类) person  
    {   
    }  
    class person1 : person   // person1 派生于基类person,person1就叫person的一个子类,  
    {   
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            person1 per = new person1();  //将子类person1实例化一个对象per  
            person Per = per;        //将子类隐式转换为父类  
              
              
        }  
    }  
}

從類別類型s到介面類型t的轉換,其中類別s實作了介面t;(有關介面(interface)的內容後面會寫到,用它只聲明方法不定義方法)

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{  
    public interface Infa   //定义了一个接口  
    {  
        void Output();  
    }  
    class person : Infa    //定义一个person类继承于接口并实现方法  
    {  
        public void Output()  
        {  
            Console.WriteLine("Welcome");  
        }  
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            person per = new person();  //实例化  
  
            Infa fa = per;    //从person到interface(接口)隐式转换  
              
        }  
    }  
}

從介面類型s到介面類型t的轉換,其中t是s的父介面;

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{  
    public interface Infa   //定义了一个接口  
    {  
        void Output();  //接口只声明方法,具体实现由它的派生类写代码决定  
    }  
    public interface infa1 : Infa    //定义一个infa1接口继承于Infa接口  
    {  
        void input();  
    }  
    class person1 : infa1  //由infa1派生一个person1类,因为接口不能直接实例化  
    {   
    }  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            person1 per = new person1 { };  //接口不能直接实例化,需要实例化一个派生于infa1接口person1类  
  
            Infa fa = per;    //实现子接口到父借口隐式转换  
              
        }  
    }  
}
    引用型別數組s到引用型數組t轉換,其中s是t的派生類,並且數組維數得相同;
  • using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Test  
    {  
        class Person //定义一个基类 Person   
        {   
        }  
        class person1 : Person  //由基类派生一个子类person1  
        {   
        }  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                person1[] per = new person1[5];  //实例化一个person1  
      
               Person[] Per = per;    //实现隐式转换  
                  
            }  
        }  
    }

    在這裡要提醒的是,引用型別數組如果是值型別數組以下程式碼就會報錯:

    class Program  
        {  
            static void Main(string[] args)  
            {  
                int[] n_int = new int[10];  
                double[] n_doubel = new double[10];  
                n_doubel = n_int;  //这里报错啦  
                  
            }  
        }

    從數組型別到System.Array的轉換;(Array是所有數組的基類參考上一篇^_^)

    using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Test  
    {  
        class Program  
        {  
            static void Main(string[] args)  
            {  
                int[] n_int = new int[10];    //实例化一个int类型的数组 n_int  
                Array arr = n_int;  // Array表示的就是数组 所以不能Array[] arr  
            }  
        }
  • 從任何代表型別到System.Delegate的轉換;(後面會寫到delegate)
  • using System;  
    using System.Collections.Generic;  
    using System.Linq;  
    using System.Text;  
      
    namespace Test  
    {  
        class Program  
        {  
            public static int output(int s)  //定义一个方法  
            {  
                Console.WriteLine("welcome,{0}",s);  
                return 1;  
            }  
      
            public delegate int mydel(int s);  //声明一个委托(以后我会说到委托)  
              
            static void Main(string[] args)  
            {  
                mydel my = new mydel(output);   //将 output方法委托给my  
                Delegate MYDEL = my;    //向 MYDEL 隐式转换  
            }  
        }  
    }

    以上就是 C#学习日记16----隐式转换具体用例的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn