Anscheinend Nullable<int>
und int?
sind im Wert gleichwertig. Gibt es Gründe, sich für einen anderen zu entscheiden?
Nullable<int> a = null;
int? b = null;
a == b; // this is true
Kein Unterschied.
int?
ist nur eine Abkürzung für Nullable<int>
, für die selbst eine Abkürzung ist Nullable<Int32>
.
Der kompilierte Code ist genau derselbe, den Sie verwenden möchten.
Das
?
Formular ist nur eine Abkürzung für den vollständigen Typ. Persönliche Vorlieben sind der einzige Grund, sich für eine andere zu entscheiden.Alle Details hier .
quelle
Während ich völlig einig , dass in den meisten Fällen die gleichen sind, ich kam vor kurzem in einer Situation, wenn es ist ein Unterschied zwischen diesen beiden. Für die blutigen Details siehe diese Frage , aber um Ihnen hier ein kurzes Beispiel zu geben:
Die erste Zeile enthält die folgenden Fehlermeldungen:
Wenn Sie neugierig auf den genauen Grund dafür sind, empfehle ich Ihnen wirklich, die bereits verknüpfte Frage zu überprüfen. Das Grundproblem besteht jedoch darin, dass wir in der Analysephase nach einem
is
(oder einemas
) Operator, wenn wir einem?
Token gegenüberstehen, prüfen, ob die nächste Frage vorliegt Token kann als unärer Operator interpretiert werden (&
könnte einer sein) und wenn ja: Der Parser kümmert sich nicht um die Möglichkeit, dass das?
Token ein Typmodifikator ist, er verwendet einfach den Typ davor und analysiert den Rest so, als ob der?
Token waren ein ternärer Operator (daher schlägt die Analyse fehl).Während also im allgemeinen
int?
undNullable<int>
untereinander austauschbar sind, gibt es einige Sonderfälle , wenn sie völlig unterschiedlichen Ergebnissen führen, weil, wie der Parser Code sieht.quelle
test
ist also mit einer Klammer festgelegtvar test = (a is int?) & b;
. Kann auch mit fixiert werdenvar test = a is int? && b;
, und dab
ein einfacher Wert Parameter (keine Nebenwirkungen auf Auswertung) scheint es seltsam zu bevorzugen&
über&&
.?
ist ein Schlüsselzeichen.int?
als ternäre Operation (var test = a is int? <return if true> : <return if false>
) interpretiert wird , nicht als nullable int.bool
Überladungen finden Sie in der Dokumentation . Dies sind boolesche logische Operatoren (das&
fürbool
) und boolesche bedingte logische Operatoren (das&&
fürbool
). Beachten Sie, wie der erste dieser Unterabschnitte eindeutig als logisch bezeichnet wird . Denken Sie daran, dass es in C # keine Konvertierungen ("Casts") zwischenbool
und numerischen Typen gibt!Bei der Verwendung der Code-First-Entity-Framework-Generierung (EF) besteht anscheinend ein Unterschied zwischen beiden:
Wenn Ihre Entität eine Eigenschaft enthält, die wie folgt deklariert ist:
EF generiert keine nullbare Eigenschaft und Sie müssen den Generator zwingen, sie wie folgt nullbar zu machen:
Auf der anderen Seite, wenn Sie Ihre Entität wie folgt deklarieren:
Der EF-Generator generiert eine nullfähige Eigenschaft mit einem nullbaren Feld in der entsprechenden Datenbanktabelle.
quelle
Nullable
irgendwo eine andere Definition haben, daNullable<T>
EF mit der integrierten Funktion den Unterschied zwischen beiden nicht erkennen kann. Selbst wenn die EF-Leute sie anders behandeln wollten, konnten sie es nicht.Nullable ist ein generischer Typ, aber int? ist nicht.
Es gibt einige Szenarien, in denen Nullable über int verwendet werden sollte.
für zB: hier kann man nicht ersetzen Nullable mit int?
Wie können Sie den folgenden Code ändern, ohne Nullable zu verwenden ?
quelle
Nullable<T>
es istNullable<int>