2016-03-21 41 views
0

由於最後一項爲空,此聲明會導致錯誤。如何將空數組作爲C中的隱式數組的一部分#

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

據我所知,一般的編譯器將需要所有這些陣列是相同的(匿名)類型的,但現在看來似乎應該讓「空」作爲一個特例,像所有其他鍵入。

是否有某種方式來聲明上面,以便我可以有一個空數組以及非空的數組?

邁克爾

+1

這不可能確定元素的類型。 (因爲它沒有元素) –

回答

5

當然,只讓它作爲一個int[]

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

你可以,如果你iniltialise特定類型:

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

演員在哪裏? –

5
new [] {1, 2, 3} 

速記
new int[] { 1,2,3 } 

編譯器可以看出它必須是int,因爲數組包含整數。
但如果你說

new [] { } 

因爲數組爲空,類型不能確定。所以你必須明確地告訴編譯器類型是什麼:

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

隱式地創建一個空的數組是不可能的。 正如@Dennis_E所述 「自數組爲空,類型不能被確定。」

可以參考All possible C# array initialization syntaxes

從相關的部分引述:

空陣列

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

也許到this MSDN article-它給出較少的細節btw-

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() 
}; 
相關問題