Мы считаем, что этот пример демонстрирует ошибку в компиляторе 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#
Место общения программистов C#
1728160820
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
Подробнее здесь: [url]https://stackoverflow.com/questions/10177571/wrong-overload-is-overridden-when-two-methods-have-identical-signatures-after-su[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия