创建集合时,我们可以进行大量的填充...
Foo a = new Foo();
a.Add("a");
a.Add("b");
或者我们可以如下使用一个更简单的collection initializer ...
Foo a = new Foo() {"a", "b"};
当然,这是假设您已实现IEnumerable
所定义的appropriate methods。有趣的是,ienumerable.cs源代码没有说明Add()
,更不用说传递给该方法的数据类型了。这里有一些"spooky action at a distance"。
作为旁注,当数据类型暗示为 其中有一个空格(对于数据类型而言是非法的)。 C# 文档似乎为我们的
Collection Initializer
指出了这一点(如果 就是这样)。
考虑一个更复杂的Foo
,其中包含key:value
对...
Foo a = new Foo() {
{"alpha": "Hello"},
{"beta": "World"}
};
The syntax当然看起来像Dictionary
,但是在封闭的Foo.Add()
方法上设置断点时,它唯一起作用的是该列表中的单个条目。
此外,没有将单个条目(例如{"alpha": "Hello"}
)显式传递给该方法。该“数组”(?)中的各个元素作为单独的参数应用于该方法。
public void Add(string key, string value) { ... }
C#被吹捧为一种强类型语言,但是在这里我们从不声明输入的类型。我只能假定编译器(?)在类中搜索具有匹配签名的适当Add
方法,然后调用该方法,一次打包一个单独的值。
“好”,对于编译器来说可能会很快通过,但是如果我们想实现一个Foo.Append()
方法,该方法需要一个Collection Initializer
并将其添加到Foo的末尾,该怎么办?实例?只需写
a.Append({
{"gamma": "I Like"},
{"delta": "turtles."}
});
但是,这被编译器拒绝。可以想象用new Dictionary()
对实例化key:value
只是为了传递给我们的方法...但是为什么要麻烦呢?尤其是如果只是要丢弃它,则将其引入我们的目标Foo
数据集中。
Collection Initializer
的实际情况吗?Append()
?