4

から: http://msdn.microsoft.com/en-us/library/2s05feca.aspx

要素にはデフォルトの初期化がないため、要素の初期化から new 演算子を省略できないことに注意してください。

int[][] jaggedArray3 = 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};

どういう意味ですか?

new in を省略してもよい理由:

int[]    arrSimp = { 1, 2, 3 };
int[,]   arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } };

ただし、次の場合はできません:

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

2 に答える 2

9

まず、偶然ですが、あなたの質問の 1 つの側面が、今日の私のブログのテーマです。

http://ericlippert.com/2013/01/24/five-dollar-words-for-programmers-elision/

C# が式を分類する方法に小さな「いぼ」があることを発見しました。結局のところ、配列初期化構文{1, 2, 3}ではありません。むしろ、別の式の一部としてのみ使用できる構文単位です。

new[] { 1, 2, 3 }
new int[] { 1, 2, 3 }
new int[3] { 1, 2, 3 }
new int[,] { { 1, 2, 3 } }
... and so on

またはコレクション初期化子の一部として:

new List<int> { 1, 2, 3 }

または変数宣言で:

int[] x = { 1, 2, 3 };

式が期待される他のコンテキストで配列初期化構文を使用することは正しくありません。例えば:

int[] x;
x = { 1, 2, 3 }; 

合法ではありません。

これは、C# 言語の奇妙な特殊なケースです。あなたが発見した矛盾に深い意味はありません。

于 2013-01-24T16:29:14.917 に答える
1

本質的に、答えは「彼ら (言語設計者を意味する) がそうしないことを選択したからです。Eric Lippert からの引用:

実装されていないすべての機能が実装されていないのと同じ理由です。機能はデフォルトで実装されていません。機能を実装するには、(1) 考え、(2) 設計し、(3) 指定し、(4) 実装し、(5) テストし、(6) 文書化し、(7) 出荷する必要があります。

より技術的には、それには正当な理由があり、それが 1 次元および多次元配列と比較したギザギザ配列の定義です。

1 つ以上の次元配列は、平易な英語で T の X 次元配列として表現できます。ジャグ配列は、T の配列の配列として表現する必要があります。2 番目のケースでは、内側の配列と外側のアリー。つまり、新しい配列を外側の配列内の位置に割り当てることができますが、x 次元の配列は固定されています。

ジャグ配列は実装において多次元配列とは大きく異なることがわかったので、2 に対する統合サポートのレベルが異なる理由を推測することもできます。サポートを追加することは確かに不可能ではなく、単に需要と時間。

(ティーザーとして、ジャグ配列のサポートのみを追加するのはなぜですか?独自のカスタム型はどうですか?)

于 2013-01-24T03:15:31.273 に答える