Există un paradox în descrierea de excepție: Poate fi nul obiect trebuie să aibă o valoare (?!)
Aceasta este problema:
Am un DateTimeExtended clasa, care a
{
DateTime? MyDataTime;
int? otherdata;
}
și un constructor
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime.Value;
this.otherdata = myNewDT.otherdata;
}
rularea acestui cod
DateTimeExtended res = new DateTimeExtended(oldDTE);
aruncă o `InvalidOperationException cu mesajul:
poate fi nul obiect trebuie să aibă o valoare.
myNewDT.MyDateTime.Valoarea
- este valabil și conține un regulat "DateTime" obiect.
Care este sensul acestui mesaj și ce fac gresit?
Rețineți că oldDTE
nu este null
. Am'am eliminat "Valoare" din myNewDT.MyDateTime
dar aceeași excepție este aruncată din cauza unei generate setter.
Ar trebui să schimbați linia asta.MyDateTime = myNewDT.MyDateTime.Valoare;a doar pentru asta.MyDateTime = myNewDT.MyDateTime;
Excepție au primit a fost aruncat în .Valoarea
proprietatea Null "DateTime", după cum este necesar pentru a reveni un "DateTime" (din ca's ce contractul pentru `.Valoarea membre), dar se poate't face acest lucru, deoarece acolo's nu "DateTime" să se întoarcă, așa că aruncă o excepție.
În general, este o idee proastă să orbește sun .Valoarea pe un null tip, dacă aveți unele cunoștințe anterioare că variabila **TREBUIE** conține o valoare (de exemplu, printr-o **
.HasValue`** verificați).
EDIT
Aici's cod pentru DateTimeExtended
care nu arunca o excepție:
class DateTimeExtended
{
public DateTime? MyDateTime;
public int? otherdata;
public DateTimeExtended() { }
public DateTimeExtended(DateTimeExtended other)
{
this.MyDateTime = other.MyDateTime;
this.otherdata = other.otherdata;
}
}
L-am testat astfel:
DateTimeExtended dt1 = new DateTimeExtended();
DateTimeExtended dt2 = new DateTimeExtended(dt1);
Adăugarea .Valoarea " pe " celălalt.MyDateTime
provoacă o excepție. Scoate-l scapa de excepție. Cred că're în căutarea în locul greșit.
Atunci când se utilizează metode de extensie LINQ (de exemplu, "Alege", "Unde"), în funcție lambda ar putea fi transformate în SQL că ar putea să nu se comporte identic la C# cod. De exemplu, C#'s scurt-circuit evaluate ||
și &&
sunt convertite la SQL's dornici " ȘI " și "SAU". Acest lucru poate cauza probleme atunci când're de verificare pentru nul în lambda.
Exemplu:
MyEnum? type = null;
Entities.Table.Where(a => type == null ||
a.type == (int)type).ToArray(); // Exception: Nullable object must have a value
Încercați cădere .valoarea
DateTimeExtended(DateTimeExtended myNewDT)
{
this.MyDateTime = myNewDT.MyDateTime;
this.otherdata = myNewDT.otherdata;
}
În acest caz oldDTE este nulă, astfel încât atunci când încercați să accesați oldDTE.Valoarea InvalidOperationException este aruncat când nu există nici o valoare. În exemplu, puteți face pur și simplu:
this.MyDateTime = newDT.MyDateTime;
Am primit acest mesaj când încercați să accesați valori de null evaluate obiect.
sName = myObj.Name;
acest lucru va produce o eroare. În primul rând ar trebui să verificați dacă obiectul nu null
if(myObj != null)
sName = myObj.Name;
Aceasta funcționează.