2009-01-26 30 views
16

C#類型推斷有多好?我在某處讀到它僅用於局部變量?它是否適用於課堂級別的屬性?對於方法簽名?方法返回類型?等C#類型推斷有多好?

回答

36

有幾個主要種類型推理的C#:

  • 隱式類型的局部變量:

    • 只有局部變量
    • 只有當值被指定爲聲明的一部分
    • 值不能爲空
    • 值不能爲lambda表達式,匿名方法或方法組(無鑄造)
    • 值的編譯時類型被用於變量的任何進一步的用途是僅檢查的可變
    • 類型針對由初始聲明+分配確定的類型;他們對推理本身沒有貢獻。
  • 通用方法類型自變量推斷,即您沒有在對泛型方法的調用中指定類型參數,編譯器根據參數計算出它們。

    • 將是非常方便有這個泛型類型以及泛型方法
    • 真的很方便呢 - LINQ將是很難或根本無法使用,沒有它
    • 匿名類型是沒有它
    • 相當無用
    • 非常複雜的規則,即使該規範是錯在一些地方
  • Lambda表達式的參數類型推斷

    • 編譯器試圖制定出基於在其中它的使用
    • 通常工作得很好,在我的經驗
  • 數組類型推斷,如上下文的類型lambda表達式的參數的new[] { "Hi", "there" }代替new string[] { "Hi", "there" }

    • 各種小的限制,沒有重大

我可能已經忘記了其他的一些功能可能被稱爲「類型推斷」。我懷疑你主要是對第一個感興趣,但其他人可能也與你有關:)

7

它只能用於局部變量,但它可以檢測許多不同形式的類型。

var myVar = SomeMethodThatReturnsInt(); //will know it's an int 
var myIntList = new List<int>(); //this works too (although this is technically not type inference) 
var myOwnVar = new { Name = "John", Age = 100 }; // will create own type and infer that 

編輯:另一個Tye推論的例子是與蘭巴達斯。 IE:

var myList = new List<int>(); 
//add some values to list 

int x = myList.Find(i => i == 5); // compiler can infer that i is an int. 
+3

爲什麼第二個例子不是技術上的類型推斷? – 2011-02-03 17:50:41