How to: Initialize a Dictionary with a Collection Initializer (C# Programming Guide) 中说明了您的代码不工作的原因:
字典包含键/值对的集合。它的 Add 方法有两个参数,一个是键,一个是值。要初始化字典,或任何 Add 方法采用多个参数的集合,请将每组参数括在大括号中...
因此,在语法中
{
{ "enabled", "enable", "enabling" },
}
编译器希望您的集合具有Add(string, string, string) 方法。因为List<string []>上没有这个方法,所以你的编译失败。
实际上,可以创建这样的集合并使用这种语法对其进行初始化。如果您创建以下集合:
public class TripleCollection<T> : IEnumerable<Tuple<T, T, T>>
{
readonly List<Tuple<T, T, T>> list = new List<Tuple<T, T, T>>();
public void Add(T first, T second, T third)
{
list.Add(Tuple.Create(first, second, third));
}
public IEnumerator<Tuple<T, T, T>> GetEnumerator()
{
return list.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
以下将成功编译并创建一个包含一个 3 元组的集合:
var tuples = new TripleCollection<string>
{
{ "1", "2", "3" },
};
您还可以创建以下List 子类:
public class ListOfArray<T> : List<T[]>
{
public new void Add(params T[] args)
{
base.Add(args);
}
}
并使用所需的语法对其进行初始化:
var synonyms = new ListOfArray<string>
{
{ "enabled", "enable", "enabling" },
{ "disabled", "disable", "disabling" },
{ "s0", "s0 state" },
{ "s5", "s5 state" }
};
但是对于List<string []>,正如其他人所指出的,您需要通过显式分配每个string [] 条目来初始化同义词列表,而不是为每个条目使用隐式集合初始化器:
var synonyms = new List<string[]>
{
new [] { "enabled", "enable", "enabling" },
new [] { "disabled", "disable", "disabling" },
new [] { "s0", "s0 state" },
new [] { "s5", "s5 state" }
};