Wie funktioniert GetValueOrDefault Arbeit?
Ich bin verantwortlich für einen LINQ-provider, die führt einige Laufzeit-Evaluierung von C# - code. Als Beispiel:
int? thing = null;
accessor.Product.Where(p => p.anInt == thing.GetValueOrDefault(-1))
Derzeit der obige code funktioniert nicht mit meiner LINQ-provider aufgrund thing
null.
Zwar arbeite ich mit C# für eine lange Zeit, ich weiß nicht, wie GetValueOrDefault implementiert ist und daher, wie ich dieses Problem beheben.
Also meine Frage ist: wie funktioniert GetValueOrDefault
Arbeit in dem Fall, dass die Instanz, auf dem es aufgerufen wird, ist null? Warum ist nicht ein NullReferenceException
geworfen?
Einen Folgen auf die Frage: wie soll ich über die Replikation von einem Aufruf GetValueOrDefault
mit Reflexion gegeben, die ich brauche, um zu behandeln von null-Werten.
Nullable<>
struct ist etwas besonderes. Als eine Struktur, d.h. es kann nicht wirklich sein null
, aber die Sprache erlaubt, um es zu null
das erzeugt nur eine Instanz mit HasValue
auf false gesetzt. GetValueOrDefault
wahrscheinlich nicht hier arbeiten, weil Sie mit EF (oder eine andere query-provider), die nicht wissen, wie um es zu übersetzen, um SQL.was meinst du mit "es funktioniert nicht"?
"funktioniert nicht" - was passiert genau?
Sorry, ich glaube das hast du falsch verstanden, die Frage. Ich weiß, wie zu lösen dieses spezielle Beispiel, aber ich bin mir nicht sicher, was in der CLR ermöglicht Instanz-Methoden aufgerufen werden, die auf null-Typen.
Ja, ich habe falsch gelesen, dass Sie wurden für den LINQ-Anbieter. Sorry!
InformationsquelleAutor Ian Newson | 2015-04-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
thing
ist nichtnull
. Da structs können nichtnull
, soNullable<int>
können nichtnull
.Die Sache ist die... es ist nur compiler-magic. Sie denke es ist
null
. In der Tat, dieHasValue
ist lediglichfalse
.Wenn Sie anrufen
GetValueOrDefault
es wird geprüft, obHasValue
isttrue
oderfalse
:Es ist immer noch Magie in der compiler / debugger, etc. Die Interna verschleiern, was tatsächlich geschieht. Siehe den link zu der Bezugsquelle in meiner Antwort.
Ok, also wenn es um die Reflexion, ich brauche nur zu replizieren die CLR testen, ob der Typ ein Nullable<> und erzeugen einer Instanz mit HasValue false manuell. Danke!
In der Tat. Benötigen Sie mehr Hilfe zu bekommen diese umgesetzt?
Nein, danke für das Angebot. Am Ende musste ich hart code eine Implementierung der GetValueOrDefault in meine Ausdrucksauswertung. Weit weniger als ideal, aber ich wäre schockiert, wenn die .NETTO-Logik geändert.
InformationsquelleAutor Patrick Hofman
Einen
NullReferenceException
nicht geworfen wird, weil es keine Referenz. DieGetValueOrDefault
ist eine Methode, bei derNullable<T>
Struktur, also das, was Sie verwenden es auf ein Werttyp ist, nicht eine Referenz geben.Den
GetValueOrDefault(T)
- Methode wird einfach implementiert, wie dies:So, replizieren, Verhalten Sie müssen nur überprüfen Sie die
HasValue
- Eigenschaft, um zu sehen, was Wert zu verwenden ist.HasValue
bei der Verwendung von Reflexion, weil die Instanz zurückgegeben wird, ist tatsächlich null.Es klingt wie immer die Instanz bedeutet, dass Sie den Wert der Variablen. Das würde den Wert abrufen und konvertieren es in ein Objekt. Sie sollten sich auf die variable selbst, anstatt seinen Wert.
InformationsquelleAutor Guffa
GetValueOrDefault ()
verhindert Fehler, die auftreten können, wegen der null. Gibt 0 zurück, wenn die eingehenden Daten ist null.int ageValue = age.GetValueOrDefault(); //if age==null
Den Wert
ageValue
wird gleich null sein.InformationsquelleAutor Murat Kara
Ich denke, Ihr provider hat nicht richtig funktioniert. Ich habe einen einfachen test und es funktioniert einwandfrei.
Es produziert als output: Produkt--1 - -1
Das ist, warum ich gesagt habe: "ich denke, Ihr provider hat nicht richtig funktioniert.". Ihre Frage war, über die Funktionalität des "GetValueOrDefault in dem Fall, dass die Instanz, auf dem es aufgerufen wird, ist null".
So ziemlich alle Abfrage-Anbieter, entwerfen, nicht unterstützen jede mögliche operation, die Sie tun können, in LINQ to objects. Einige sind absichtlich nicht unterstützt, in der Regel aufgrund der Art der Abfrage-Anbieter und was ist es eigentlich Abfragen machen, eine übersetzung des gegebenen Ausdrucks nicht möglich ist, die Datenquelle, die Sie darstellt.
InformationsquelleAutor Charles Schneider