使用数组初始化语法在C#上初始化Dictionary实例时会发生什么?

CAR*_*OTH 3 c# dictionary

有谁知道C#编译器使用以下代码做什么?

dict = new Dictionary<int, string>()
{
    { 1, "value1" },
    { 2, "value2" }
}
Run Code Online (Sandbox Code Playgroud)

它是否创建KeyValuePair实例并调用Add方法或执行更优化的操作尚不清楚.你们中有谁都知道吗?

Meh*_*ari 10

它将Add使用值作为参数调用对象上的方法:

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

名称Add是硬编码的(在C#规范中指定:7.5.10.3:集合初始值设定项).该方法的参数数量不受限制.它只需匹配方法的参数数量.IEnumerable提供Add方法的任何集合(实现接口)都可以这样使用.

为了进一步澄清,不,编译器并不真正关心该类是Dictionary创建KeyValuePair并传递给它的类Add.它只是生成一个对Add方法的调用序列,在每次调用中传递每个集合项中的所有参数.该Add方法负责其余部分.

  • 这里有一个非常小的修正 - 在*所有Add调用之后*之前不会分配变量.基本上它就好像有一个临时变量.这是一个挑剔,但嘿 - 我们在这里"为了掩护":)(虽然不值得一个单独的答案.)你可能还想提一下,该集合必须实现`IEnumerable`,即使没有调用`GetEnumerator()`. (4认同)