内联列表初始化

Joh*_*ohn 39 c#

这样做时我得到一个奇怪的错误:(.net 2.0)

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

VS要求;之后().为什么?

我当然可以这样做:

public overrides string[] getSpaceballs
{
    get { return new string[] { "abc","def","egh" }; }
}
Run Code Online (Sandbox Code Playgroud)

And*_*are 80

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

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

var list = new List<String> { "foo", "bar" };
Run Code Online (Sandbox Code Playgroud)

但是,此语句由编译器翻译为:

List<String> <>g__initLocal0 = new List<String>();
<>g__initLocal0.Add("foo");
<>g__initLocal0.Add("bar");
List<String> list = <>g__initLocal0;
Run Code Online (Sandbox Code Playgroud)

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


C. *_*oss 10

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

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

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


Noo*_*ilk 5

第一个选项不合法:)

您只能在阵列上执行该类型的初始化程序.

- 编辑:见Andrew Hare的帖子(和其他人,下面); 它仅适用于v3及更高版本.

- 再次编辑:

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

  • Collection Initializers在C#3.0中添加. (3认同)
  • @silky:OP明确表示他在某些方面使用.NET 2.0*.他没有说清楚他是否正在使用.NET 2.0或****来构建*.两者都可以很容易地被解释为"使用"2.0. (2认同)

小智 5

以防万一现在有人也会搜索它,有一种巧妙的方法可以使用 LINQ 扩展来做到这一点。希望它对某人有帮助;)

var list = new string[]{ "1", "2", "3" }.ToList();
Run Code Online (Sandbox Code Playgroud)