Разрешение перегрузки в C # 4.0 с использованием динамических типов - PullRequest
5 голосов
/ 12 июня 2009

У меня пока нет доступа к предварительному просмотру 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 ) );
}

1 Ответ

6 голосов
/ 12 июня 2009

В общем, я понимаю, что результат должен (когда это возможно) быть таким же, как результат, если бы вы скомпилировали тот же код с просто динамическими выражениями, замененными выражениями того типа, который динамический значение имеет во время выполнения. (Статически известные типы сохраняются в информации сайта вызова.)

В этом конкретном случае, имея только ваш код с .NET 4.0b1, результат будет:

Bar(int) says: 0

Однако, посмотрев на это снова (и проверив, какой бит на самом деле является динамическим), я немного растерялся. Я думаю, что это одна из тех ситуаций, когда я должен был бы очень внимательно изучить спецификацию, чтобы понять, каково правильное поведение. К сожалению, я не знаю, когда будет доступна спецификация C # 4.0.

Это сложный вопрос, и я подозреваю, что ключевая часть заключается в том, может ли связыватель во время выполнения определить, что значение имеет тип T для того же T, что и получатель, а не введите int. Поскольку приемник в этом случае является динамическим, компилятор вообще не выполняет никакого разрешения перегрузки. Хм. Хитрый, определенно.

...