C#學習日記16----隱式轉換具體用例

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

隱式轉換:

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

比如:int i = 100;

long a = i; //無需聲明自動的將int 型轉換為long型

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

long a = 100;

int i = a; //編譯器會報錯

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

  • 隱式數值轉換

  • 隱式枚舉轉換

  • 隱式引用轉換

  • 隱式數值轉換:

隱式數值轉換包括以下幾種:

  • 從sbyte 類型到short、int、long、float、double、decimal類型;

  • 從byte 類型到short、ushort、int、uint、long、ulong、float、double、decimal類型;

  • 從short 類型到 int、long、flaot、double、decimal類型;

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

  • 從int 類型到 long、flaot、double、decimal類型;

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

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

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

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

  • 從float 類型到 double類型;

寫了這麼多總結下吧,概括的說就是從低精度類型到高精度類型轉換(因為不丟失精度與資料資訊),而從高精度類型到低精度不能隱式轉換(可能會丟失部分資訊,不安全)。有關類型的精度與範圍請參照 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 編譯器就會給出錯誤。

隱式引用轉換:

  • 從任何參考型別到物件類型的轉換;

    (Person p = new Person())

  • 從類類型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 派生於基類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----隱式轉換具體用例的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.