程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> C#教程:隱式類型數組

C#教程:隱式類型數組

編輯:關於.NET

隱式類型數組

在C# 1和2中, 初始化一個數組作為聲明一個變量的一部分其表達式是相當簡潔的——但是如果你想在任何地方創建它, 你不得不聲明數組的顯式類型. 因此下面的例子完全可以聽過編譯而沒有任何問題:

   1: string[] names = {"Holly", "Jon", "Tom", "Robin", "William"};

下面的代碼則無法工作, 即便我們聲明了方法MyMethod的簽名為MyMethod(string[] names):

   1: MyMethod({"Holly", "Jon", "Tom", "Robin", "William"});

相反, 我們不得不告訴編譯器你想要初始化的數組類型:

   1: MyMethod(new string[] {"Holly", "Jon", "Tom", "Robin", "William"});

C# 3則允許類似下面這樣的調用:

   1: MyMethod(new[] {"Holly", "Jon", "Tom", "Robin", "William"});

很明顯, 編譯器需要去推斷出要使用的數組類型. 從大括號裡面的元素開始, 如果能夠找到一個所有其他元素都可以隱式轉換的類型, 那麼這就是數組的類型, 否則代碼將無法編譯. 如果元素是類型無關的的表達式, 例如常量null或者匿名函數, 代碼也無法編譯. 注意只有表達式的類型會被考慮為整體數組類型的候選. 這意味著我們可能偶爾不得不將一個值顯式轉換到另外一個范圍更小的類型. 例如, 下面的代碼將無法編譯:

   1: new[] { new MemoryStream(), new StringWriter() }

無法從MemoryStream轉換到StringWriter, 反之也一樣. 雖然兩者都能夠被轉換成object或者IDisposable, 但編譯器僅僅考慮表達式本身所產生的類型. 在這個例子中, 如果我們將其中的一個類型顯式轉換到object或者IDisposable接口, 那麼代碼將可以編譯通過:

   1: new[] { (IDisposable) new MemoryStream(), new StringWriter() }

最後整個表達式的類型是IDisposable[]. 比較一下之前我們提到的其他特性, 隱式類型數組有一點點令人洩氣. 雖然他們確實讓生活變得更加簡單一點, 例如傳遞數組作為參數的例子. 然而你可以爭論的一點是其並沒有在”用處和復雜度”的平衡上證明自己, 而這一點通常是語言設計者用來決定哪些特性應該成為語言的一部分. 設計人員沒有發瘋, 然而——有一個很重要的情形, 在那裡隱式類型數組是非常關鍵的. 那就是當你不知道(實際上根本無法知道)數組裡面元素的類型名稱的時候, 你如何才能進入這種特殊的狀態? 待續!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved