Мы считаем, что этот пример демонстрирует ошибку в компиляторе 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 Сэма Нг, мы получаем выражение, что эта ошибка не была исправлена, потому что они считали, что исключение загрузки типа -всегда будет выдаваться.Но в нашем примере код компилируется и работает без ошибок (просто неожиданный вывод ).