0

この2つの奇妙な行動が理解できません

1.最初の行動

私はこのような変数を宣言しました

double[][] dd =
{
    new double[10],
    new double[10]
};

エラーは発生しません。

しかし、私がこれを好きなら、それはエラーを出します

double[][] dd;

dd = { // Here it gives 2 errors says Invalid Expression { and ; expected 
      new double[10], 
      new double[10] //Here and in the above line it says only  
                     //assignment, call, increment....can be used as a statement
     };

これを行うとエラーがなくなります

double[][] dd;

dd = new double[][]{
                     new double[10],
                     new double[10]
                   };

なんで?

2.2番目の動作

,さらに、上記のいずれかの場合に配列の最後の要素の後に余分なコンマを入れてもエラーにはなりません

{
 new double[10],
 new double[10], //This comma here is not given as error. Why?
};

その余分なコンマが、その後にもう1つのエンティティを追加する必要があることを指定していない場合。

4

3 に答える 3

4

かなり古いドキュメントですが、それでも関連性があります。あなたが見ているのは配列イニシャライザーです

配列初期化子は、フィールド宣言(セクション10.4)、ローカル変数宣言(セクション8.5.1)、および配列作成式(セクション7.5.10.2)で指定できます。

注意してください、それはあなたが最初のエラーで試みていることである代入ステートメントでそれらが利用可能であるとは言いません。


2番目の質問に対して、追加が許可される理由,は利便性です。最初または最後の項目を特別なケースにする必要がない場合、コードがプログラムで生成されている場合に特に役立ちます。列挙型宣言などにも同様の構文があります。

于 2012-05-12T06:57:31.093 に答える
1
  1. あなたの例は、C#の配列初期化構文の例です。初期化式は、変数を定義した行でのみ発生します。{}表記が、たとえばPythonやRubyの[]配列リテラル式によく似ていることを期待しているように見えます。彼らは本当にそうではありません。

  2. これにより、末尾のコンマを使用して、時間の経過とともに長さが変化するイニシャライザーに入るアイテムのリストをより均一にすることができます。たとえば、そこにカンマがあるので、最後に新しいアイテムを追加するには、1行を編集するだけで、1行を編集してカンマを追加し、別の行を編集して新しいコンテンツを追加する必要はありません。

于 2012-05-12T06:59:26.210 に答える
0
  1. 1つ目は、他の人が言及しているアレイイニシャライザーによるものです。同様の動作は、ObjectInitializersとCollectionInitializersを使用して他のオブジェクトに拡張されます。

  2. .NETのJonSkeetの回答を参照してください。Pythonのように配列の末尾のコンマがサポートされるようになりました

于 2012-05-13T02:39:44.543 に答える