编译器如何理解 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?

您的方法中的所有内容都保持不变,startDateendDate 参数仍然是 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.