


Синтаксис C#, знак вопроса
string? name = Console.ReadLine();
зачем нужен знак вопроса после типа?
без него компилятор подчеркивает метод зеленым курсивом. (да, у меня VS)
Если это раздражает, то вот вам костыль:
var line = Console.ReadLine() ?? "";
Конструкция:
string? name;
это краткая (и более удобная) запись конструкции:
System.Nullable<string> name;
И означает она то, что переменная name имеет nullable-тип: т.е. name может содержать либо строку, либо константу null, означающую: "значение отсутствует".
nullable тип для значимых типов данных. Теперь он может быть null.
Обозначает, что переменная может принимать значение null. Нет знака вопроса - не может быть null.
Добавьте ? к типу, если переменная может быть null:
string? name = Console.ReadLine();
Теперь компилятор знает, что name может содержать null, и проверяет ваш код на безопасное обращение с этим значением.
Используйте проверку на null:
if (name != null)
{
Console.WriteLine(name.Length); // Безопасно
}
Отключите nullable context (не рекомендуется):
Добавьте в .csproj-файл:
<Nullable>disable</Nullable>
Но лучше работать с nullable-проверками — это предотвращает ошибки.
Примеры
// Безопасный код с nullable-типом
string? input = Console.ReadLine();
if (input is not null)
{
Console.WriteLine(input.ToUpper());
}
// Опасный код (возможен NullReferenceException)
string input = Console.ReadLine()!; // "!" подавляет предупреждение (не рекомендуется)
Console.WriteLine(input.Length);