Мы считаем, что этот пример демонстрирует ошибку в компиляторе 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 должно быть четко определено, какой именно!
Но когда программа запускается, выходные данные показывают, что была переопределена неправильная перегрузка.
Когда мы читаем следующий пост Сэма Нга, мы получаем выражение, что эта ошибка не была исправлена, потому что они полагали, что исключение загрузки типа будет генерироваться всегда. Но в нашем примере код компилируется и выполняется без ошибок (только неожиданный вывод).
Дополнение в 2020 году: это было исправлено в более поздних версиях C#. компилятор (Рослин?). Когда я задал этот вопрос, результат был такой:
11
101
По состоянию на 2020 год tio.run выдает следующий результат:
101
2
Подробнее здесь: https://stackoverflow.com/questions/101 ... s-after-su
Неправильная перегрузка переопределяется, если два метода имеют идентичные сигнатуры после замены аргументов типа. ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение