2010-05-25 39 views

回答

10

它會作爲參數與值調用對象的方法Add

var __temp = new Dictionary<int, string>(); 
__temp.Add(1, "value1"); 
__temp.Add(2, "value2"); 
dict = __temp; 

名稱Add被硬編碼(在C#規範規定:7.5.10.3:集合初始化) 。該方法的參數數量不受限制。它只需要匹配方法的參數數量。可以像那樣使用提供Add方法的任何集合(實現IEnumerable接口)。

爲了進一步說明,不,編譯器並不在乎該類是否爲Dictionary來創建KeyValuePair並將其傳遞給Add。它只是生成一個調用Add方法的序列,在每個調用中傳遞每個集合項中的所有參數。其餘的方法由Add方法負責。

+4

這裏有一個非常輕微的修正 - 直到所有添加調用之後,才分配變量。基本上就好像有一個臨時變量。這是一個挑剔的問題,但是,嘿,我們要在這裏討論這個問題:)(儘管這不值得單獨回答。)您可能還想提及集合必須實現IEnumerable,儘管沒有對'GetEnumerator()'的調用。 – 2010-05-25 22:01:07

+0

更有趣的背景信息在這裏:http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx – LukeH 2010-05-25 22:01:25

+0

@Jon:關於訂單的有趣的觀察。固定。謝謝。也增加了'IEnumerable'要求。 – 2010-05-25 22:06:59