Зачем нужен "string?" (именно с вопросом а не просто "string")?

В описании Object увидел, что метод ToString() возвращает string?. Возник вопрос, зачем? Ведь string - ссылочный тип и может сам иметь значение null. Есть какая-то разница или эту обёртку добавили только чтобы подчеркнуть что метод может вернуть null?

строка 82


Ответы (2 шт):

Автор решения: Grundy

В C# 8 добавились Nullable reference types.

При использовании директивы

#nullable enable

для того, чтобы показать что ссылочный тип так же может принимать null, ему нужно добавить ? по аналогии со значимыми Nullable типами.

→ Ссылка
Автор решения: VladD

Дело тут в обратной совместимости.

В старых версиях C# ссылочные типы были все nullable (то есть, могли «законно» принимать значение null). Виртуальная функция object.ToString() была определена тогда.

Сейчас менять определение на не-nullable-вариант уже поздно, так как код пользователя, написанный ранее, имел полное право возвращать null, и если «корневая» виртуальная функция поменяет свою сигнатуру, многим придётся переписывать свой код.

Так что этот поезд уже ушёл, к сожалению. Но да, если бы C# проектировался сегодня с нуля, возвращаемый тип метода object.ToString() скорее всего сделали бы string, а не string?.

→ Ссылка