Неправильная перегрузка переопределяется, когда два метода имеют идентичные сигнатуры после замены аргументов типа

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

using System;

namespace GenericConflict
{
  class Base
  {
    public virtual int Foo(T t)
    { return 1; }
    public virtual int Foo(S s)
    { return 2; }

    public int CallFooOfT(T t)
    { return Foo(t); }
    public int CallFooOfS(S s)
    { return Foo(s); }
  }

  class Intermediate : Base
  {
    public override int Foo(T t)
    { return 11; }
  }

  class Conflict : Intermediate
  {
    public override int Foo(string t)
    { return 101;  }
  }


  static class Program
  {
    static void Main()
    {
      var conflict = new Conflict();
      Console.WriteLine(conflict.CallFooOfT("Hello mum"));
      Console.WriteLine(conflict.CallFooOfS("Hello mum"));
    }
  }
}

Идея состоит в том, чтобы просто создать класс Baseс двумя виртуальными методами, сигнатуры которых станут идентичными после «злого» выбора Tи S. Класс Conflictперегружает только один из виртуальных методов, и из-за существования Intermediate<,>должно быть хорошо -определено, какой именно!

Но когда программа запущена, вывод, кажется, показывает, что неправильная перегрузка была переопределена.

Когда мы читаем Follow -up post Сэма Нг, мы получаем выражение, что эта ошибка не была исправлена, потому что они считали, что исключение загрузки типа -всегда будет выдаваться.Но в нашем примере код компилируется и работает без ошибок (просто неожиданный вывод ).

12
задан Jim Mischel 16 April 2012 в 16:03
поделиться