kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 Dani
Dani
Question

poate fi nul obiect trebuie să aibă o valoare

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.

172 2009-12-13T11:08:19+00:00 7
The  Red Pea
The Red Pea
Întrebarea editată 26 ianuarie 2015 в 8:39
Programare
c#
invalidoperationexception
nullable
Solution / Answer
 Yuliy
Yuliy
13 decembrie 2009 в 11:14
2009-12-13T11:14:27+00:00
Mai mult
Sursă
Editează
#9806507

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.

 Matt
Matt
Răspuns editat 14 decembrie 2017 в 9:59
183
0
Protector one
Protector one
21 ianuarie 2015 в 1:23
2015-01-21T13:23:23+00:00
Mai mult
Sursă
Editează
#9806511

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
8
0
Paul Creasey
Paul Creasey
13 decembrie 2009 в 11:12
2009-12-13T11:12:30+00:00
Mai mult
Sursă
Editează
#9806504

Încercați cădere .valoarea

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}
 ArunPratap
ArunPratap
Răspuns editat 19 august 2019 в 5:07
5
0
 Lee
Lee
13 decembrie 2009 в 11:13
2009-12-13T11:13:32+00:00
Mai mult
Sursă
Editează
#9806506

Î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;
2
0
Cecil  Has a Name
Cecil Has a Name
13 decembrie 2009 в 11:13
2009-12-13T11:13:25+00:00
Mai mult
Sursă
Editează
#9806505

Atribui direct membrii fără .Valoarea parte:

DateTimeExtended(DateTimeExtended myNewDT)
{
   this.MyDateTime = myNewDT.MyDateTime;
   this.otherdata = myNewDT.otherdata;
}
1
0
Pavel Radzivilovsky
Pavel Radzivilovsky
13 decembrie 2009 в 11:14
2009-12-13T11:14:43+00:00
Mai mult
Sursă
Editează
#9806509

Se pare ca oldDTE.MyDateTime a fost nul, deci constructorul a încercat să-l ia's Valoare - care a aruncat.

0
0
 Juris
Juris
28 septembrie 2012 в 1:19
2012-09-28T13:19:36+00:00
Mai mult
Sursă
Editează
#9806510

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ă.

0
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
DE
ES
ID
JA
KO
RO
RU
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire