重複の可能性:
このnew []の省略形は何ですか?
違いはありますか
var strings = new string[] { "hello", "world" };
と
var strings2 = new[] { "hello", "world" };
重複の可能性:
このnew []の省略形は何ですか?
違いはありますか
var strings = new string[] { "hello", "world" };
と
var strings2 = new[] { "hello", "world" };
この場合、new[]
提供された値のタイプを。として推測するため、違いはありませんstring
。
暗黙的に型指定された配列を参照してください。
変わりはない。
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 } };
この場合、違いはありません。のためにhello
そしてworld
ですstring
;
var strings2 = new[] { "hello", "world" };
string[]
最初の配列と同じ配列を作成します。
2つ目はちょうど呼ばれますImplicitly Typed Arrays
さらに一歩進むと、同じIL
コードになります。
なし、コンパイルはそれを次のように解釈しますnew string[] { "hello", "world" };
を使用するのと同じようvar
に、コンパイラはあなたが意図したことを処理します。
new []は、要素から型が推測される暗黙的に型指定された配列を作成します。他のアプローチは文字列の配列を作成します。
違いはありません。2番目のケースでは、C#コンパイラは、配列の初期化に使用される値が文字列型であることがわかるため、配列の型を推測するのに十分賢いです。