Die Beschreibung der Ausnahme enthält ein Paradoxon: Nullbares Objekt muss einen Wert haben (?!)
Das ist das Problem:
Ich habe eine DateTimeExtended
Klasse, die hat
{
DateTime? MyDataTime;
int? otherdata;
}
und ein Konstruktor
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
diesen Code ausführen
DateTimeExtended res = new DateTimeExtended(oldDTE);
wirft eine InvalidOperationException
mit der Nachricht:
Das Objekt mit dem Wert "null" braucht einen Wert.
myNewDT.MyDateTime.Value
- ist gültig und enthält ein reguläres DateTime
Objekt.
Was bedeutet diese Nachricht und was mache ich falsch?
Beachten Sie, dass dies oldDTE
nicht der Fall ist null
. Ich habe das Value
von entfernt, myNewDT.MyDateTime
aber die gleiche Ausnahme wird aufgrund eines generierten Setzers ausgelöst.
Antworten:
Sie sollten die Zeile
this.MyDateTime = myNewDT.MyDateTime.Value;
auf einfach ändernthis.MyDateTime = myNewDT.MyDateTime;
Die Ausnahme, die Sie erhalten haben, wurde in die
.Value
Eigenschaft der Nullable geworfenDateTime
, da eine Rückgabe erforderlich istDateTime
(da dies im Vertrag für.Value
Staaten festgelegt ist). Dies ist jedoch nicht möglich, da keineDateTime
Rückgabe möglich ist. Daher wird eine Ausnahme ausgelöst .Im Allgemeinen ist es eine schlechte Idee, blind
.Value
einen nullbaren Typ aufzurufen , es sei denn, Sie haben Vorkenntnisse darüber, dass diese Variable einen Wert enthalten MUSS (dh durch eine.HasValue
Prüfung).BEARBEITEN
Hier ist der Code dafür
DateTimeExtended
, der keine Ausnahme auslöst:Ich habe es so getestet:
Das Hinzufügen der
.Value
aufother.MyDateTime
eine Ausnahme verursacht. Durch das Entfernen wird die Ausnahme beseitigt. Ich denke, Sie suchen am falschen Ort.quelle
.Value
ist sinnvoll, eine Ausnahme zu erhalten, die ein Null-Objekt aufruft (glaube ich), aber die Ausnahmemeldung ist wirklich irreführend, wenn Sie sich zufällig mit zwei Nullable-Objekten befassen. Etwas wie 'Die .Value-Eigenschaft erfordert, dass das Objekt nicht null ist' wäre viel sinnvoller.Wenn LINQ - Erweiterungsmethoden (zB
Select
,Where
), kann die Lambda - Funktion zu SQL umgewandelt werden , die nicht identisch mit C # -Code verhalten könnte. Zum Beispiel wird der Kurzschluss von C # ausgewertet&&
und||
in SQLs eifrigeAND
und konvertiertOR
. Dies kann zu Problemen führen, wenn Sie in Ihrem Lambda nach Null suchen.Beispiel:
quelle
Versuchen Sie, das fallen zu lassen
.value
quelle
In diesem Fall ist oldDTE null. Wenn Sie also versuchen, auf oldDTE.Value zuzugreifen, wird die InvalidOperationException ausgelöst, da kein Wert vorhanden ist. In Ihrem Beispiel können Sie einfach Folgendes tun:
quelle
Weisen Sie die Mitglieder direkt ohne das
.Value
Teil zu:quelle
Sieht so aus, als ob oldDTE.MyDateTime null war, also hat der Konstruktor versucht, den Wert zu übernehmen - was geworfen hat.
quelle
Ich habe diese Meldung erhalten, als ich versucht habe, auf Werte eines Objekts mit Nullwert zuzugreifen.
Dies führt zu Fehlern. Zuerst sollten Sie prüfen, ob das Objekt nicht null ist
Das funktioniert.
quelle
this.MyDateTime = myNewDT.MyDateTime.Value;
nichtsName = myObj.Name;