如何在C#中将空数组作为implict数组的一部分

时间:2016-03-21 14:44:53

标签: c# anonymous-types

此声明会导致错误,因为最后一项为空。

  var foo = new[] {
                 new [] {1, 2, 3},
                 new [] {3, 4, 5},
                 new [] {}
                 };

据我所知,编译器通常需要所有这些数组都是相同的(匿名)类型,但似乎它应该允许“空”作为特殊情况,并像所有其他类型一样键入它。

有没有办法声明上面的内容,以便我可以有一个空数组和非空数组?

迈克尔

5 个答案:

答案 0 :(得分:6)

new [] {1, 2, 3}

的简写
new int[] { 1,2,3 }

编译器可以确定它必须是int,因为数组包含整数 但如果你说

new [] { }

由于数组为空,因此无法确定Type。所以你必须明确告诉编译器Type是什么:

var foo = new[] {
             new [] {1, 2, 3},
             new [] {3, 4, 5},
             new int [] {}
             };

答案 1 :(得分:5)

当然,只需将其设为int[]

int[][] foo = new[] {
         new [] {1, 2, 3},
         new [] {3, 4, 5},
         new int[] {}
};

答案 2 :(得分:0)

如果您对特定类型不感兴趣,可以使用

        var foo = new int[][] {
             new int[] {1, 2, 3},
             new int[] {3, 4, 5},
             new int[] {}
             };

答案 3 :(得分:0)

无法隐式创建空数组。 正如@Dennis_E所说“由于数组为空,因此无法确定类型。”

您可以参考All possible C# array initialization syntaxes

引自相关部分:

清空数组

...
var data8 = new [] { } and int[] data9 = new [] { } are not compilable.
...

也许this MSDN article - 它给出了更少的细节btw -

答案 4 :(得分:0)

如果您不想显式写入类型,可以使用linq过滤最后一个数组

var foo = new [] {
    new [] {1, 2, 3},
    new [] {3, 4, 5},
    new [] {0}.Where(e => false).ToArray()
};

这样,如果您必须将此代码更改为:

,它将起作用
var foo = new[] {
    new [] { new { N = 1 }, new { N = 2 }, new { N = 3} },
    new [] { new { N = 3 }, new { N = 4 }, new { N = 5} },
    new [] { new { N = 0 } }.Where(e => false).ToArray()
};