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

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Неправильная перегрузка переопределяется, если два метода имеют идентичные сигнатуры после замены аргументов типа.

Сообщение Anonymous »

Мы считаем, что этот пример демонстрирует ошибку в компиляторе 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»