环境: Visual Studio 2015
时区: : UTC + 7:00, 曼谷
问题:在 DateTimeOffset 可为空的变量(DateTimeOffset?)上,使用 Null 条件运算符会导致异常,即即使值为 NULL,它仍会调用该方法,即(值作为 DateTimeOffset?)?.ToLocalTime(),它调用 ToLocalTime 和导致异常。
查询:我可以通过不使用 Null 条件运算符或使用 GetValueOrDefault 而不是运算符来解决它,但我想了解为什么它会在所有 UTC + TimeZones 中出现异常,它适用于 UTC - TimeZones
代码:
var dateTimeMinimum = DateTime.MinValue;
var value = (object)dateTimeMinimum; // Mimic the WPF converter behavior
var a1 = value as DateTimeOffset?; // This works
if (a1 != null)// This works as it won't execute the code in the 'if'loop
{
var b1 = (a1 as DateTimeOffset?)?.ToLocalTime();
}
var dto = (value as DateTimeOffset?)?.ToLocalTime() ?? (DateTime)value;// This breaks with following exception
编辑:
我知道有很多方法可以修复代码,即
DateTime dateTimeMinimum = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
这是我的查询,当我不使用空条件运算符时
var a1 = value as DateTimeOffset?;
它不会导致异常。是不是因为空条件运算符根据以下博客展开变量
http://www.ninjacrab.com/2016/09/11/c-how-the-null-conditional-operator-works-with-nullable-types/
我更感兴趣的是理解为什么当我使用空条件运算符时它会中断,而当我使用'as'运算符而不使用 DateTimeKind.Utc 进行简单转换时它会起作用
编辑2:
这是 DateTimeOffset(.NET 框架代码)的构造函数,它在 ValidateOffset 方法处中断。来源- http://referencesource.microsoft.com/#mscorlib/system/datetimeoffset.cs,68b4bb83ce8d1c31
// Constructs a DateTimeOffset from a DateTime. For Local and Unspecified kinds,
// extracts the local offset. For UTC, creates a UTC instance with a zero offset.
public DateTimeOffset(DateTime dateTime) {
TimeSpan offset;
if (dateTime.Kind != DateTimeKind.Utc) {
// Local and Unspecified are both treated as Local
offset = TimeZoneInfo.GetLocalUtcOffset(dateTime, TimeZoneInfoOptions.NoThrowOnInvalidTime);
}
else {
offset = new TimeSpan(0);
}
m_offsetMinutes = ValidateOffset(offset);
m_dateTime = ValidateDate(dateTime, offset);
}