18

重複の可能性:
このnew []の省略形は何ですか?

違いはありますか

var strings = new string[] { "hello", "world" };

var strings2 = new[] { "hello", "world" };
4

6 に答える 6

29

この場合、new[]提供された値のタイプを。として推測するため、違いはありませんstring

暗黙的に型指定された配列を参照してください。

于 2013-01-15T15:34:20.157 に答える
7

変わりはない。

2つ目は、 「暗黙的に型指定された配列」と呼ばれる構文糖衣構文であり、両方の式が文字列の配列を返します。

配列のタイプを指定しない場合、配列の初期化に使用される要素のタイプから推測されます。
推論を可能にするには、式が次の条件を満たす必要があります。

次のような暗黙的に型指定された配列式を検討します。

   var arr = new []{ obj1, ... , objn }

初期化の要素のすべてのタイプのセットは次のとおりです。

   S = {T1, ..., Tn}

推論を可能にする(つまり、コンパイラエラーがない)には、すべての型 { T1, ... , Tn } をセット内の型の1つに暗黙的にキャスト Sできる必要があります。

したがって、たとえば、次のクラスがあるとします。

class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
class Derived3
{ 
    public static implicit operator Base(Derived3 m)
    { return null; }
}

このコードはコンパイルされます:

var arr = new []{ new Derived1(), new Derived2(), new Derived3(), new Base()};

以下はしませんが:

var arr = new []{ new Derived1(), new Derived2(), new Derived3() };

前者の場合、3つのタイプすべてを暗黙的にタイプBaseにキャストでき、Baseタイプはセット内にありS = { Derived1, Derived2, Derived3, Base }ますが、後者の場合、すべてのタイプをセット内の1つのタイプにキャストすることはできません。S = { Derived1, Derived2, Derived3 }


この機能は、匿名型とともにC#3.0で導入されており、後者の配列のインスタンス化が容易になります。

たとえば、暗黙的に型指定された配列がないと、これを取得するのは非常に困難です。

var arrayOfAnonymous = new[] { new { A = 3, B = 4 }, new { A = 2, B = 5 } };
于 2013-01-15T15:35:14.397 に答える
6

この場合、違いはありません。のためにhelloそしてworldですstring;

var strings2 = new[] { "hello", "world" };

string[]最初の配列と同じ配列を作成します。

ここに画像の説明を入力してください

2つ目はちょうど呼ばれますImplicitly Typed Arrays

さらに一歩進むと、同じILコードになります。

于 2013-01-15T15:37:10.307 に答える
2

なし、コンパイルはそれを次のように解釈しますnew string[] { "hello", "world" };

を使用するのと同じようvarに、コンパイラはあなたが意図したことを処理します。

于 2013-01-15T15:35:21.067 に答える
1

new []は、要素から型が推測される暗黙的に型指定された配列を作成します。他のアプローチは文字列の配列を作成します。

于 2013-01-15T15:34:00.263 に答える
0

違いはありません。2番目のケースでは、C#コンパイラは、配列の初期化に使用される値が文字列型であることがわかるため、配列の型を推測するのに十分賢いです。

于 2013-01-15T15:35:11.387 に答える