Il y a un paradoxe dans la description de l'exception: l'objet Nullable doit avoir une valeur (?!)
C'est le problème:
J'ai une DateTimeExtended
classe, qui a
{
DateTime? MyDataTime;
int? otherdata;
}
et un constructeur
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
exécuter ce code
DateTimeExtended res = new DateTimeExtended(oldDTE);
jette un InvalidOperationException
avec le message:
L'objet Nullable doit avoir une valeur.
myNewDT.MyDateTime.Value
- est valide et contient un DateTime
objet normal .
Quelle est la signification de ce message et qu'est-ce que je fais de mal?
Notez que oldDTE
non null
. J'ai supprimé Value
de myNewDT.MyDateTime
mais la même exception est levée en raison d'un setter généré.
Réponses:
Vous devriez changer la ligne
this.MyDateTime = myNewDT.MyDateTime.Value;
en justethis.MyDateTime = myNewDT.MyDateTime;
L'exception que vous receviez a été lancée dans la
.Value
propriété du NullableDateTime
, car il est nécessaire de retourner unDateTime
(puisque c'est ce que le contrat pour les.Value
états), mais il ne peut pas le faire car il n'y a pasDateTime
de retour, donc il lève une exception.En général, c'est une mauvaise idée d'appeler aveuglément
.Value
un type Nullable, sauf si vous avez une certaine connaissance préalable que cette variable DOIT contenir une valeur (c'est-à-dire via une.HasValue
vérification).ÉDITER
Voici le code pour
DateTimeExtended
cela ne lève pas d'exception:Je l'ai testé comme ceci:
L'ajout de
.Value
onother.MyDateTime
provoque une exception. Le supprimer supprime l'exception. Je pense que vous cherchez au mauvais endroit.la source
.Value
un objet nul a du sens (je suppose), mais le message d'exception est vraiment trompeur si vous avez affaire à deux objets Nullable. Quelque chose comme «La propriété .Value exige que l'objet soit non nul» aurait beaucoup plus de sens.Lors de l'utilisation de méthodes d'extension LINQ (par exemple
Select
,Where
), la fonction lambda peut être convertie en SQL qui peut ne pas se comporter de manière identique à votre code C #. Par exemple, le court-circuit de C # évalué&&
et||
converti en SQL hâteAND
etOR
. Cela peut poser des problèmes lorsque vous vérifiez la valeur null dans votre lambda.Exemple:
la source
Essayez de laisser tomber le
.value
la source
Dans ce cas, oldDTE est nul, donc lorsque vous essayez d'accéder à oldDTE.Value, l'exception InvalidOperationException est levée car il n'y a aucune valeur. Dans votre exemple, vous pouvez simplement faire:
la source
Affectez les membres directement sans la
.Value
pièce:la source
On dirait que oldDTE.MyDateTime était nul, donc le constructeur a essayé de prendre sa valeur - ce qui a jeté.
la source
J'ai reçu ce message en essayant d'accéder aux valeurs d'un objet à valeur nulle.
cela produira une erreur. Vous devez d'abord vérifier si l'objet n'est pas nul
Cela marche.
la source
this.MyDateTime = myNewDT.MyDateTime.Value;
, nonsName = myObj.Name;
J'ai cette solution et ça marche pour moi
la source