Код: Выделить всё
public class Number
{
[System.Obsolete()] public string ToExactString() => "";
[System.Obsolete()] public override string ToString() => "";
}
< /code>
Теперь рассмотрите этот код: < /p>
Number number = new();
string s1 = number.ToExactString();
string s2 = number.ToString();
< /code>
и теперь, наблюдайте, что происходит: < /p>
[list]
[*] Вызов toExactString () < /code> отображается визуальным Студия с промежуткой, а компилятор генерирует предупреждение CS0612: «Участник» устарел ». em> рендерирован Visual Studio с промежуточным, [b], но компилятор не генерирует никаких предупреждений. [/b]
[/list]
В результате:
не имеет значения, замечает ли мои стареющие глаза пробег на вызов toExactString ()
Однако, если я не смогу Обратите внимание на промежуток времени при вызове этого toString () , я никогда не узнаю. Разница между двумя методами заключается в том, что toExactString () не является переопределением, в то время как toString () является переопределением метода без абсолюта, но это должно быть совершенно неактуальным и совершенно несущественным в этом сценарии , потому что я храню ссылку на число , а не ссылку на объект .
Не то, что это имеет значение, но чтобы быть ясным, во всем моем c# Проекты, которые у меня есть CS0809: «устаревший член участника переопределяет необсолетный участник» отключен , поскольку это предупреждение совершенно бессмысленно, так как оно совершенно нормально и даже в некоторых случаях очень желательно для Иметь устаревший элемент, который переопределяет не-абсолютного элемента, в зависимости от обстоятельств здесь с ToString () . Дело в том, что я хочу , чтобы создать устаревшее переопределение, которое никто не должен напрямую вызывать, даже если это может быть законно вызвать код, содержащий ссылку на базовый класс. < /p>
Visual Studio отображает все призывы к промежутке, что показывает, что Visual Studio прекрасно понимает, какой метод вызывается в каждом случае, тогда как Рослин притворяется, что не понимает, какой метод является методом вызывается в случае toString () , как будто это является переопределением, так или иначе. .Obsolete ("Сообщение")] Затем предупреждение о вызове toExactString () Изменения в CS0618: «член» устарел: «Сообщение», но абсолютно ничего не изменится.
Вопросы: < /p>
- Это ошибка в компиляторе C#? < /li>
Есть ли есть ошибка известное исправление или обходной путь?
Подробнее здесь: https://stackoverflow.com/questions/794 ... ber-usages