6

C# 4.0 プレビューにまだアクセスできません。しかし、次のケースでオーバーロードされたメソッドを呼び出すときに、C# 4.0 ランタイムは何をするのか、興味があります。一般的なオーバーロードに解決されますか...または特殊なオーバーロードに解決されますか。

public class Foo<T>
{
  protected string BarImpl( T value ) { return "Bar(T) says: " + value.ToString(); }

  protected string BarImpl( int value ) { return "Bar(int) says: " + value.ToString(); }

  public string Bar( T value )
  {
    dynamic foo = this;
    return foo.BarImpl( value );
  }
}

public static void Main( string args[] )
{
  var f = new Foo<int>();

  Console.WriteLine( f.Bar( 0 ) );
}
4

1 に答える 1

6

一般に、実行時に動的な値が持つ型の式に置き換えられた動的な式だけで同じコードをコンパイルした場合、結果は (可能な限り) 結果と同じになるはずであるという私の理解です。(静的に既知の型は、呼び出しサイト情報に保持されます。)

この特定のケースでは、コードだけで .NET 4.0b1 を使用すると、結果は次のようになります。

Bar(int) says: 0

しかし、これをもう一度見て(そしてどのビットが実際に動的であるかを確認して)、私は少し混乱しています。正しい動作が何であるかを理解するために、仕様を非常に注意深く調べなければならない状況の 1 つだと思います。残念ながら、C# 4.0 仕様がいつ利用可能になるかはわかりません。

推論するのは難しいものであり、重要な部分は、実行時に、値が typeではなくレシーバーTと同じ型であることをバインダーが解決できるかどうかだと思います。この場合、レシーバーは動的であるため、コンパイラーはオーバーロードの解決をまったく行いません。うーん。トリッキーなものです、間違いなく。Tint

于 2009-06-12T15:20:09.900 に答える