Мы полагаем, что этот пример обнаруживает ошибку в компиляторе С# (смейтесь над мной, если мы ошибаемся). Эта ошибка может быть хорошо известна. В конце концов, наш пример представляет собой простое изменение описания в этом сообщении в блоге.
using System;
namespace GenericConflict
{
class Base<T, S>
{
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<T, S> : Base<T, S>
{
public override int Foo(T t)
{ return 11; }
}
class Conflict : Intermediate<string, string>
{
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>
с двумя виртуальными методами, чьи подписи станут идентичными после "злого" выбора T
и S
. Класс Conflict
перегружает только один из виртуальных методов, и из-за существования Intermediate<,>
он должен быть хорошо определен, какой из них!
Но когда программа запускается, выход, похоже, показывает, что неправильная перегрузка была переопределена.