内联列表初始化

时间:2010-01-07 13:01:31

标签: c#

执行此操作时出现了一个奇怪的错误:(。net 2.0)

public overrides List<String> getSpaceballs
{
    get { return new List<String>() { "abc","def","egh" }; }
}

VS在;之后要求()。为什么呢?

我当然可以这样做:

public overrides string[] getSpaceballs
{
    get { return new string[] { "abc","def","egh" }; }
}

4 个答案:

答案 0 :(得分:75)

C#的collection initialization syntax仅在版本3及更高版本中受支持(因为您提到.NET 2.0我将假设您也在使用C#2)。它可能有点令人困惑,因为C#总是支持类似的数组初始化语法,但它实际上并不是一回事。

集合初始值设定项是一种编译器技巧,允许您在一个语句中创建和初始化集合,如下所示:

var list = new List<String> { "foo", "bar" };

然而,编译器将此语句翻译为:

List<String> <>g__initLocal0 = new List<String>();
<>g__initLocal0.Add("foo");
<>g__initLocal0.Add("bar");
List<String> list = <>g__initLocal0;

正如您所看到的,此功能是一些语法糖,可以将模式简化为单个表达式。

答案 1 :(得分:7)

正如其他用户所指出的那样,2.0不支持。但是,您可以通过执行以下操作来模仿它。

public overrides List<String> getSpaceballs
{
   get { return new List<String> ( new String[] {"abc","def","egh"} ); }
}

请注意,这会产生一些计算开销。

答案 2 :(得分:5)

第一种选择不合法:)

您只能在数组上执行该类型的初始化。

- 修改:请参阅Andrew Hare's帖子(以及其他人,下方);它仅适用于v3及更高版本。

- 再次编辑:

为了清楚起见,如果你的编译器是3或更高,你可以定位2.0,以使其工作(因为它编译为安德鲁显示的代码,如下)。但是如果你的编译器是2,那你就不能。

答案 3 :(得分:1)

即使今天也有人搜索它,也有一种使用LINQ扩展的巧妙方法。希望它能帮助到别人;)

var list = new string[]{ "1", "2", "3" }.ToList();