Environnement: Visual Studio 2015opérateur nul conditionnel avec DateTimeOffset annulable
Fuseau horaire:: UTC + 7:00, Bangkok
Problème: Sur DateTimeOffset annulable varialbe (? DateTimeOffset), la l'utilisation de l'opérateur Null conditionnel entraîne une exception, c'est-à-dire qu'elle appelle la méthode même si la valeur est NULL (valeur en tant que DateTimeOffset?)? ToLocalTime(), elle appelle ToLocalTime et entraîne une exception.
Recherche: Je peux le résoudre par ne pas utiliser l'opérateur conditionnel nul ou à l'aide du GetValueOrDefault au lieu de l'opérateur, mais je veux comprendre pourquoi il Resutls en exception avec tous UTC + TimeZones, il fonctionne bien avec UTC - TimeZones
code:
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
EDIT:
Je crois savoir qu'il ya plusieurs façons de corriger le code-à-dire
DateTime dateTimeMinimum = DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
Voici ma requête si, quand je ne l'utilise l'opérateur conditionnel null
var a1 = value as DateTimeOffset?;
Il ne entraîner une exception. Est-ce parce que l'opérateur conditionnel null unwraps la variable par la suite Blog
http://www.ninjacrab.com/2016/09/11/c-how-the-null-conditional-operator-works-with-nullable-types/
Je suis plus intéressé à comprendre pourquoi il se casse lorsque j'utilise l'opérateur nul conditionnel et fonctionne quand je rejetterai simple, si vous utilisez le « comme » opérateur sans utiliser le DateTimeKind.Utc
EDIT2:
C'est le constructeur de DateTimeOffset (.NET code-cadre) et il se casse à la méthode ValidateOffset. Source - 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);
}
Quelle est la valeur du décalage lorsque cette exception a été levée? Le message d'erreur semble suggérer que l'année résultante était soit inférieure à 0 ou supérieure à 10K – pquest
DateTime.MinValue –
qui est la valeur du décalage? – pquest