7

私はちょうどこれらの「何を...」の瞬間の1つを持っていました. 以下は意図されたものであり、C# での配列の「非自然」宣言の背後にはあいまいな理由がありますか?

int[,][] i; // declares an 2D - array where each element is an int[] !
// you have to use it like this:
i = new int[2,3][];
i[1,2] = new int[0];

私は逆のことを期待していたでしょう。int[,][] は、各要素が 2 次元配列である 1 次元配列を宣言します。

おもしろいことに、型の名前が逆になっています。

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]"

誰かがこれを説明できますか?これは意図的にですか?(Windows で .NET 4.5 を使用。)

4

2 に答える 2

8

EricLippertのブログArraysofarraysで長い議論を見つけることができます

C#が実際に行うこと

それは混乱です。どのオプションを選択しても、何かが私たちの直感と一致しないことになります。これがC#で実際に選択したものです。

最初に:オプション2 [これは2次元配列であり、各要素はintの1次元配列です]は正しいです。私たちはあなたにコンシークエンスワンに伴う奇妙さを持って生きることを強制します。配列指定子を追加して、要素タイプをそのタイプの配列にすることは実際にはありません。既存の配列指定子のリストの前に指定子を追加することにより、配列型にします。クレイジーですが本当です。

「先頭に追加する」という単語は、逆の型名の出力を部分的に説明しています。CLRタイプ名は、必ずしもC#宣言と同じである必要はありません。

しかし、より関連性の高い引用は下部にあります:

とはいえ、多次元のジャグ配列は、ほぼ間違いなくコードの臭いです。

于 2012-09-21T15:14:30.660 に答える
1

new int[5][];の代わりに、初めて見たときと同じ「なんて…」の瞬間がありましnew int[][5];た。

EL の (非常に素晴らしい) ブログ投稿は、1 つのことをめぐって踊っています。ComSci の学位を持つ人には完璧な方法がありますが、他の人には良い方法はありません。文法に従うだけなら、右から左、new右から左、インデックスを左から右に宣言します。

// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];

しかし、C# の対象読者は、CS の学位を 4 年間取得した人ではありません (リバース ポリッシュを見て、右から左への変換が好きな人は皆そうです)。 、技術的に必要がなかった場合。

于 2016-03-04T23:34:20.893 に答える