DateTime c# 上的空合并运算符

Null coalescing Operator on DateTime c#

我个人喜欢 null coalescing Operator 并尝试在我的 getter 中使用它。但它似乎仅限于某些数据类型。 例如以下未构建:

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

错误 CS0019 运算符“??”不能应用于 'DateTime' 和 'DateTime'

类型的操作数

以下是:

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

有人知道为什么吗?是它还没有实现还是我错过了这里的逻辑?

空合并运算符 (??) 仅在运算符左侧的表达式可为空时才有效。

错误信息:

Error CS0019 Operator '??' cannot be applied to operands of type 'DateTime' and 'DateTime'

表明 Settings.Default.StartDate 不可为空 - 它是 DateTime.

因此,您需要将 StartDate 更改为 nullable 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;

那么为什么 ?? 不做同样的事情呢? (即让你使用 ?? 当它真的没有意义时使用它)基本上是因为它不是那样定义的 - 它不想让你做无意义的事情,所以编译器检测到并阻止它。

DateTime 类型是一个结构(不是 class/reference 类型):https://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx