Среда: Visual Studio 2015.
Часовой пояс: UTC + 7:00, Бангкок.
Проблема: в переменной DateTimeOffset, допускающей значение NULL (DateTimeOffset?), использование оператора Null Conditional приводит к исключению, т. е. он по-прежнему вызывает метод, даже если значение равно NULL, т. е. (значение как DateTimeOffset?)? ToLocalTime ( ), он вызывает ToLocalTime и вызывает исключение.
Запрос: я могу разрешить его, не используя условный оператор Null или используя GetValueOrDefault вместо оператора, но я хочу понять, почему он преобразуется в исключение для всех UTC + часовых поясов, он хорошо работает с UTC - Часовые пояса
Код:
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);
Вот мой запрос, когда я не использую условный оператор null
var a1 = value as DateTimeOffset?;
Это не приводит к исключению. Это потому, что условный оператор null разворачивает переменную в следующем блоге
http://www.ninjacrab.com/2016/09/11/c-how-the-null-conditional-operator-works-with-nullable-types/
Мне больше интересно понять, почему он ломается, когда я использую условный оператор null, и работает, когда я просто выполняю приведение при использовании оператора 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);
}
DateTime
какDateTimeOffset
? Это всегда даетnull
, по крайней мере, в моем случае. - person Andrew   schedule 24.09.2016value as DateTimeOffset?
не является допустимым преобразованием, он всегда будет давать значение null, не используйте это. Операторas
имеет свойство не генерировать исключения, когда он недопустим, поэтому вы получаете тамnull
. Если вы замените это наvar a1 = (DateTimeOffset?)value
, вы получите соответствующийSystem.InvalidCastException
. - person Andrew   schedule 25.09.2016