此声明会导致错误,因为最后一项为空。
var foo = new[] {
new [] {1, 2, 3},
new [] {3, 4, 5},
new [] {}
};
据我所知,编译器通常需要所有这些数组都是相同的(匿名)类型,但似乎它应该允许“空”作为特殊情况,并像所有其他类型一样键入它。
有没有办法声明上面的内容,以便我可以有一个空数组和非空数组?
迈克尔
答案 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()
};