С# ! (нуль-прощающий) не работает должным образомC#

Место общения программистов C#
Ответить
Anonymous
 С# ! (нуль-прощающий) не работает должным образом

Сообщение Anonymous »

Я просматривал некоторый код и предложил исправление для проверки того, что что-то не является нулевым, что может быть нулевым, и предложил следующее:

Код: Выделить всё

// Path: Employee.cs
public class Employee(string name, DateTime? arrivalTime = null) {
public string Name = name;
public DateTime? ArrivalTime = arrivalTime;
}

Код: Выделить всё

// Path: Program.cs
class Program
{
static void Main(string[] args)
{
var testDate = DateTime.ParseExact(
"2024-12-10 10:30:00",
"yyyy-MM-dd HH:mm:ss",
System.Globalization.CultureInfo.InvariantCulture
);

var employees = new List([
new Employee("Matt"),
new Employee("John", testDate),
new Employee("Steve")
]);

foreach (var employee in employees)
{
if (employee.ArrivalTime == null) continue;

var arrivalDate = DateOnly.FromDateTime(employee.ArrivalTime!);
Console.WriteLine($"{employee.Name} arrives at {arrivalDate}.");
}
}
}
Я предполагал, что оператор, не допускающий значений NULL, сработает. Насколько я понимаю и читаю справочную документацию, он должен подавлять ошибку нулевого значения. Но при компиляции я получаю следующую ошибку: «Ошибка CS1503: Аргумент 1: невозможно преобразовать из «System.DateTime?» на "System.DateTime".
Я использую SDK .NET 8.0.404.
Однако я изменю код на

Код: Выделить всё

var arrivalDate = DateOnly.FromDateTime((DateTime)employee.ArrivalTime);
или

Код: Выделить всё

var arrivalDate = DateOnly.FromDateTime(employee.ArrivalTime ?? DateTime.Now);
заставляет его работать нормально.
По сути, мой вопрос: почему он не понимает, что подавление значений null безопасно в этом контексте? Мой LSP понимает, что это значение, допускающее значение NULL, если я удаляю проверку NULL, и предупреждает меня об этом, но даже с проверкой NULL он не позволяет мне использовать оператор !. Я неправильно понимаю использование оператора?
Заранее спасибо. :)

Подробнее здесь: https://stackoverflow.com/questions/792 ... s-expected
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»