编译器如何理解 Nullables?
How does the compiler understand Nullables?
如果我有方法:
protected int CalculateActualDuration(DateTime? startDate, DateTime? endDate) {
if (startDate.HasValue && endDate.HasValue) {
return Math.Abs((int)(endDate.Value.Subtract(startDate.Value).TotalMinutes));
}
else {
return 0;
}
}
我可以通过传入两个 DateTime 来调用该方法吗?和一个日期时间。那么编译器如何理解差异呢?
这是否意味着如果我传入 DateTime 值,if 语句基本上会像
if (true && true)
并且所有 *.value 都已更改为正确的对象?所以所有 endDate.Value 现在都是 EndDates?
编译器是否在运行时将所有非 Nullable 的参数都转换为 Nullable?
您的方法中的所有内容都保持不变,startDate
和 endDate
参数仍然是 Nullable<T>
struct.
的实例
当您将 "normal" DateTime
传递给该方法时,您正在利用 Nullable<T>
结构中指定的 implicit conversion:
public static implicit operator Nullable<T>(T value) {
return new Nullable<T>(value);
}
来自上面链接的 MSDN 页面:
If the value parameter is not null, the Value property of the new Nullable value is initialized to the value parameter and the HasValue property is initialized to true.
如果我有方法:
protected int CalculateActualDuration(DateTime? startDate, DateTime? endDate) {
if (startDate.HasValue && endDate.HasValue) {
return Math.Abs((int)(endDate.Value.Subtract(startDate.Value).TotalMinutes));
}
else {
return 0;
}
}
我可以通过传入两个 DateTime 来调用该方法吗?和一个日期时间。那么编译器如何理解差异呢?
这是否意味着如果我传入 DateTime 值,if 语句基本上会像
if (true && true)
并且所有 *.value 都已更改为正确的对象?所以所有 endDate.Value 现在都是 EndDates?
编译器是否在运行时将所有非 Nullable 的参数都转换为 Nullable?
您的方法中的所有内容都保持不变,startDate
和 endDate
参数仍然是 Nullable<T>
struct.
当您将 "normal" DateTime
传递给该方法时,您正在利用 Nullable<T>
结构中指定的 implicit conversion:
public static implicit operator Nullable<T>(T value) {
return new Nullable<T>(value);
}
来自上面链接的 MSDN 页面:
If the value parameter is not null, the Value property of the new Nullable value is initialized to the value parameter and the HasValue property is initialized to true.