首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 3.0 隱含型別陣列:new[] 語法、型別推斷規則與匿名型別結合應用

     編輯:關於C語言

語法形式

var a = new[] { 1, 10, 100 };        // int[]
var b = new[] { 1, 1.5, 2.0 };       // double[]
var c = new[] { "hello", null };     // string[]

關鍵差異:省略型別名稱,僅保留 new[],由編譯器根據元素推斷陣列元素型別。

型別推斷演算法

  1. 收集所有元素運算式的編譯期型別集合
  2. 尋找集合中唯一的型別 T,使其他所有型別皆可隱含轉換至 T
  3. T 不可為 null 型別
  4. 若找不到或找到多個 → 編譯錯誤

推斷範例與失敗情境

初始化器推斷結果說明
{1, 10, 100}int[]所有元素為 int
{1, 1.5, 2}double[]int 隱含轉換 double
{"hello", null}string[]null 可轉換至任何參考型別
{1, "one"}❌ 錯誤int/string 無隱含轉換關係
{null}❌ 錯誤唯一元素為 null 型別

解決推斷失敗的策略

  • 顯式指定陣列型別:object[] arr = new object[] { 1, "one" };
  • 統一元素型別:new[] { 1.0, 2.0, 3.0 } 強制 double
  • 使用共同基底型別:new[] { (Animal)new Dog(), (Animal)new Cat() }

進階:與匿名型別結合建構強型別資料結構

var contacts = new[] {
    new { 
        Name = "Chris Smith", 
        Phones = new[] { "206-555-0101", "425-882-8080" } 
    },
    new { 
        Name = "Bob Harris", 
        Phones = new[] { "650-555-0199" } 
    }
};
// contacts 型別:匿名型別[],每個元素擁有 Name (string) 與 Phones (string[])

此模式極適合:

  • 單元測試資料建構
  • 原型開發快速建立領域模型
  • LINQ 查詢中間結果投影
  • 避免為一次性資料結構定義正式類別

限制提醒

  • 僅適用於區域變數宣告(需搭配 var)
  • 不可用於欄位、屬性、方法參數、回傳型別
  • 多維陣列、交錯陣列不支援此語法

隱含型別陣列是 C# 型別推斷系統在集合字面值上的自然延伸,配合匿名型別,讓 C# 具備動態語言般的資料字面表達力,同時保持靜態型別安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved