Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+2

Синтаксис C#, знак вопроса

string? name = Console.ReadLine();
зачем нужен знак вопроса после типа?
без него компилятор подчеркивает метод зеленым курсивом. (да, у меня VS)

По дате
По рейтингу
Аватар пользователя
Высший разум
5мес

Если это раздражает, то вот вам костыль:

1
 var line = Console.ReadLine() ?? ""; 
Аватар пользователя
Высший разум
5мес

Конструкция:

1
 string? name; 

это краткая (и более удобная) запись конструкции:

1
 System.Nullable<string> name; 

И означает она то, что переменная name имеет nullable-тип: т.е. name может содержать либо строку, либо константу null, означающую: "значение отсутствует".

Аватар пользователя
Мастер
5мес

nullable тип для значимых типов данных. Теперь он может быть null.

Аватар пользователя
Мудрец
5мес

Обозначает, что переменная может принимать значение null. Нет знака вопроса - не может быть null.

Аватар пользователя
Мудрец
5мес

Добавьте ? к типу, если переменная может быть null:

1
 string? name = Console.ReadLine();  

Теперь компилятор знает, что name может содержать null, и проверяет ваш код на безопасное обращение с этим значением.

Используйте проверку на null:

1234
 if (name != null) 
{ 
    Console.WriteLine(name.Length); // Безопасно 
} 

Отключите nullable context (не рекомендуется):
Добавьте в .csproj-файл:

1
 <Nullable>disable</Nullable> 

Но лучше работать с nullable-проверками — это предотвращает ошибки.

Примеры

12345678910
 // Безопасный код с nullable-типом 
string? input = Console.ReadLine(); 
if (input is not null) 
{ 
    Console.WriteLine(input.ToUpper()); 
} 
 
// Опасный код (возможен NullReferenceException) 
string input = Console.ReadLine()!; // "!" подавляет предупреждение (не рекомендуется) 
Console.WriteLine(input.Length);