HasValue和Value

Cra*_*aig 11 c#

我在代码审查中注意到了一些事情,我想知道它是否合适.

a.EndDate.HasValue && a.EndDate > paymentPeriodEndDate
Run Code Online (Sandbox Code Playgroud)

不应该是:

a.EndDate.HasValue && a.EndDate.Value > paymentPeriodEndDate
Run Code Online (Sandbox Code Playgroud)

注意,a.EndDate是a DateTime?,而paymentPeriodEndDate是DateTime

应该使用.值?或者可以省略它.编译器允许它,并且代码可以工作.然后我想知道为什么有.Value可用.

D S*_*ley 14

可以为空的可隐式转换为它的底层类型,所以

a.EndDate > paymentPeriodEndDate
Run Code Online (Sandbox Code Playgroud)

隐式转换为

((DateTime)a.EndDate) > paymentPeriodEndDate
Run Code Online (Sandbox Code Playgroud)

这就要求.Value作为演员的一部分.
由于您已经完成了空检查,因此没有实际区别.

然后我想知道为什么有.Value可用.

Value当编译器无法隐式知道预期输出是什么时(例如,当传递给泛型方法或具有重载的方法时),您将使用.由于您正在与另一个进行比较,DateTime因此编译器可以推断出您的意图并.Value为您打电话.


*Techncially我觉得编译器在投加,因为自投运营商Nullable<T>Texplicit,但原则应该是相同的.