1

C#コンパイラは、メソッドの呼び出し方法に応じて型の推測が異なるようです。

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   }.
   ExtensionMethod();
}

この場合、ExtensionMethodが宣言されているクラスBarがあるため、コンパイラはインスタンスのタイプがBarであると推測しているようです。

void Foo<T>() where T : Bar
{
   var instance = new T()
   {
      ID = 1
   };
   instance.ExtensionMethod();
}

この場合、コンパイラーはインスタンスのタイプがTであると推測します。これは、最初のケースでも同様に実行されると私が期待することです。なぜそのような違いがあるのですか?

4

2 に答える 2

4

最初のケースでは、メソッド呼び出しの結果をインスタンスに割り当てます。2番目のケースでは、呼び出しの結果を破棄します。代わりに、new Tこれが唯一の違いです。

于 2012-06-05T21:18:02.263 に答える
1

暗黙的に型指定されたローカル変数varのキーワード定義によると:

varキーワードは、初期化ステートメントの右側にある式から変数の型を推測するようにコンパイラーに指示します。

右側にはvar、パーツだけctorでなく、voidを返す関数呼び出しもあります。したがって、関数呼び出しによって返されるから割り当て可能なタイプを推測することになります。これにより、ファクトに関するコンパイラ信号が発生します。varvoid

暗黙的に型指定されたローカル変数にvoidを割り当てることはできません

于 2012-06-05T21:25:19.713 に答える