Нулевой оператор объединения на DateTime c # - PullRequest
0 голосов
/ 04 июля 2018

Мне лично нравится оператор null coalescing , и я пытаюсь использовать его в своих методах получения. Но, похоже, он ограничен определенными типами данных. Для экземпляра следующее не строит:

public DateTime From => Settings.Default.StartDate ?? DateTime.Today;

Ошибка CS0019 Оператор '??' не может применяться к операндам типа «DateTime» и «DateTime»

и следующее:

public DateTime From => Settings.Default.StartDate == null ? DateTime.Today : Settings.Default.StartDate;

Кто-нибудь знает, почему? Это просто еще не реализовано или мне здесь не хватает логики?

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Тип DateTime - это структура (не класс / ссылочный тип): https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx

0 голосов
/ 04 июля 2018

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

Сообщение об ошибке:

Ошибка CS0019 Оператор '??' нельзя применять к операндам типа «DateTime» и «DateTime»

показывает, что Settings.Default.StartDate не обнуляется - это DateTime.

Таким образом, вам нужно изменить StartDate на обнуляемый DateTime (т.е. DateTime?).

ОК, но почему тогда:

public DateTime From => Settings.Default.StartDate == null ? DateTime.Today : Settings.Default.StartDate;

компилировать

Короткий ответ: бессмысленно, но технически правильно . Сравнение с null всегда будет false (поскольку DateTime никогда не будет null) и, следовательно, Settings.Default.StartDate всегда будет возвращено. Это просто запутанный способ написания:

public DateTime From => Settings.Default.StartDate;

Так почему же ?? не делает то же самое? (т. е. разрешить вам использовать ??, когда это на самом деле не имеет смысла его использовать) В основном потому, что это не определено таким образом - он не хочет позволять вам делать бессмысленные вещи, поэтому компилятор обнаруживает и блокирует это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...