6 Stimmen

Überlastauflösung in C# 4.0 mit dynamischen Typen

Ich habe noch keinen Zugriff auf die C# 4.0-Vorschau. Aber ich bin neugierig, was tut die C# 4.0-Laufzeit, wenn eine überladene Methode im folgenden Fall aufgerufen wird. Löst es auf die generische Überladung ... oder die spezialisierte Überladung.

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 ) );
}

6voto

Jon Skeet Punkte 1325502

Im Allgemeinen bin ich der Meinung, dass das Ergebnis (wann immer möglich) dasselbe sein sollte, wie das Ergebnis, wenn Sie denselben Code mit nur die dynamischen Ausdrücke durch Ausdrücke des Typs ersetzt, den der dynamische Wert zur Ausführungszeit hat. (Statisch bekannte Typen bleiben in der Aufrufseiteninfo erhalten.)

In diesem speziellen Fall, wenn Sie nur Ihren Code mit .NET 4.0b1 haben, ist das Ergebnis:

Bar(int) says: 0

Nachdem ich mir das jedoch noch einmal angesehen habe (und überprüft habe, welcher Teil tatsächlich dynamisch ist), bin ich etwas verwirrt. Ich glaube, das ist eine der Situationen, in denen ich nachschauen muss. sehr Sie sollten sich die Spezifikationen genau ansehen, um zu verstehen, was das richtige Verhalten ist. Leider weiß ich nicht, wann die C# 4.0 Spezifikation verfügbar sein wird.

Es ist schwierig, darüber nachzudenken, und ich vermute, der Schlüssel dazu ist, ob der Binder zur Ausführungszeit in der Lage ist, herauszufinden, dass der Wert vom Typ T für dasselbe T als Empfänger, anstatt den Typ int . Weil die Empfänger in diesem Fall dynamisch ist, führt der Compiler überhaupt keine Überlastauflösung durch. Hmm. Auf jeden Fall eine knifflige Sache.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X