9

の使用について質問がありnew[]ます。

これを想像してみてください:

Object.SomeProperty = new[] {"string1", "string2"};

SomePropertyが文字列の配列を期待する場合。

このコードスニペットが機能することはわかっています。しかし、私はそれが内部で何をするのか知りたいです。new[]クラスのインスタンスを作成し、そのobject中で自動的にオブジェクトSomePropertyに変換しますか?string

ありがとう

4

5 に答える 5

18

さて、ここにはまだ少し混乱があります。

行われている推論は、Object.SomePropertyのタイプとは関係ありませんが、配列初期化子の式のタイプとはすべて関係があります。言い換えれば、次のことができます。

object o = new[] { "string1", "string2" };

oは引き続き文字列配列への参照になります。

基本的に、コンパイラは次のような式を調べます。

new[] { A, B, C, D, ... }

(A、B、C、Dなどは式です)そして、使用する正しい配列型を見つけようとします。A、B、C、D(など)のタイプのみを配列要素タイプと見なします。この候補タイプのセットを使用して、他のすべてのタイプに暗黙的に変換できるものを見つけようとします。そのようなタイプが1つだけではない場合、コンパイラは文句を言います。

したがって、たとえば:

new[] { new Form(), new MemoryStream() }

コンパイルされません-どちらMemoryStreamForm他に変換できません。でも:

new[] { GetSomeIDisposable(), new MemoryStream() }

からへIDisposable[]の暗黙の変換があるため、として扱われます。同じく:MemoryStreamIDisposable

new[] { 0, 1, 3.5 } // double[]
new[] { 1, 3, 100L } // long[]
于 2008-11-28T08:49:28.703 に答える
15

これは単なる構文糖衣です。コンパイラーは、ここで実際に必要な型を推測し、明示的な構成と同等のコードを作成します。

Object.SomeProperty = new string[] {"string1", "string2"};

new[]実行時に実行されるようなものはありません。

于 2008-11-28T08:25:06.583 に答える
4

大まかに次のように翻訳されます。

string[] $temp = new string[2];
$temp[0] = "string1";
$temp[1] = "string2";
Object.SomeProperty = $temp;

興味深いことに、var x = new[] { "string1", "string2" };同様に機能し、xをaと推測できますstring[]が、var x = { "string1", "string2" };失敗します。

于 2008-11-28T08:28:00.430 に答える
2

コンパイラは以下を置き換えます。

Object.SomeProperty = new[] {"string1", "string2"};

と:

Object.SomeProperty = new string[] {"string1", "string2"};
于 2008-11-28T08:26:09.797 に答える
1

ここで型置換と型推論の間で混乱しないように、あなたの回答から願っています!Object.SomePropertyの型はstring[]であると想定していますが、配列の共分散のためにobject []になる可能性があります(これは良いことではないことに注意してください。このテーマに関するEric Lippertの投稿を確認してください!)。

コンパイラは、ヒューリスティックを使用して型推論を実行します。「string1」と「string2」は文字列型であると判断されるため、コードは次のように効果的に置き換えられます。

Object.SomeProperty = new string[] {"string1", "string2"};

それは本当にそれと同じくらい簡単です!これはすべてコンパイル時に行われ、実行時には何も行われません。

于 2008-11-28T08:46:02.517 に答える