Antworten:
Die anderen Antworten sind alle richtig; Ich wollte nur noch eine hinzufügen, die etwas sauberer ist:
v2 = v1 ?? default(int);
Jeder Nullable<T>
ist implizit in seinen konvertierbar T
, vorausgesetzt, dass der gesamte ausgewertete Ausdruck niemals zu einer Nullzuweisung zu einem ValueType führen kann. Der Null-Koaleszenz-Operator ??
ist also nur Syntaxzucker für den ternären Operator:
v2 = v1 == null ? default(int) : v1;
... was wiederum Syntaxzucker für ein if / else ist:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Nullable<T>
Ab .NET 4.0 gibt es außerdem eine "GetValueOrDefault ()" - Methode, bei der es sich um einen nullsicheren Getter handelt, der im Grunde die oben gezeigte Null-Koaleszenz ausführt. Dies funktioniert also auch:
v2 = v1.GetValueOrDefault();
default(int)
wirklich gebraucht? Was ist los mit einem einfachen 0
?
default
gegebenenfalls zu verwenden. Null ist nicht immer als Wert gültig, geschweige denn als Standardwert. Wenn Sie also durch int
einen generischen Wert ersetzen, T
funktioniert mein Code, während Null dies nicht tut. In einigen zukünftigen Framework-Versionen default
kann es auch zu einer Überladung kommen. In diesem Fall kann der Standardcode problemlos genutzt werden, während explizite Null- oder Nullzuweisungen geändert werden müssen.
So was,
if(v1.HasValue)
v2=v1.Value
Sie können die Value-Eigenschaft für die Zuweisung verwenden.
v2 = v1.Value;
v1.HasValue
zuerst zu überprüfen .
Wenn Sie wissen, dass dies v1
einen Wert hat, können Sie die Value
Eigenschaft verwenden:
v2 = v1.Value;
Bei Verwendung der GetValueOrDefault
Methode wird der Wert zugewiesen, falls vorhanden, andernfalls der Standardwert für den Typ oder ein von Ihnen angegebener Standardwert:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Mit der HasValue
Eigenschaft können Sie überprüfen, ob v1
ein Wert vorhanden ist:
if (v1.HasValue) {
v2 = v1.Value;
}
Es gibt auch Sprachunterstützung für die GetValueOrDefault(T)
Methode:
v2 = v1 ?? -1;
Sie können dies nicht tun, wenn v1 null ist, aber Sie können dies mit einem Operator überprüfen.
v2 = v1 ?? 0;
GetValueOrDefault()
Ruft den Wert des Objekts ab. Wenn es null ist, wird der Standardwert von int zurückgegeben, der 0 ist.
Beispiel:
v2= v1.GetValueOrDefault();
Wenn der Standardwert für einen bestimmten Typ ein akzeptables Ergebnis ist:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Wenn Sie einen anderen Standardwert wünschen, wenn das Ergebnis undefiniert ist:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Wenn Sie nur den Wert zurückgeben möchten (unabhängig davon, ob die Methode fehlgeschlagen ist oder nicht):
v2 = v1.GetValueOrDefault();
.NET 4.7.2.: Gibt GetValueOrDefault()
den Feldwert ohne Überprüfung zurück.
Für mich ist die beste Lösung die Verwendung einer GetValueOrDefault()
Methode.
v2 = v1.GetValueOrDefault();
Die Konvertierung von Int nullable in int kann folgendermaßen erfolgen:
v2=(int)v1;
es ist möglich mit v2 = Convert.ToInt32(v1);
Du könntest es tun
v2 = v1.HasValue ? v1.Value : v2;
Eine einfache Konvertierung zwischen v1
und v2
ist nicht möglich, da v1
sie einen größeren Wertebereich als hat v2
. Es ist alles, was v1
der null
Staat halten kann . Zum Konvertieren müssen Sie explizit angeben, in welchem Wert int
der null
Status zugeordnet werden soll. Der einfachste Weg, dies zu tun, ist der ??
Bediener
v2 = v1 ?? 0; // maps null of v1 to 0
Dies kann auch in Langform erfolgen
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Abhängig von Ihrem Verwendungskontext können Sie die Mustervergleichsfunktion von C # 7 verwenden:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Da einige Leute abstimmen, ohne eine Erklärung zu hinterlassen, möchte ich einige Details hinzufügen, um die Gründe für die Aufnahme als praktikable Lösung zu erläutern.
Mit dem Mustervergleich von C # 7 können wir jetzt den Typ eines Werts überprüfen und implizit umwandeln. Im obigen Snippet wird die if-Bedingung nur übergeben, wenn der in gespeicherte Wert v1
typkompatibel mit dem Typ für ist v2
, in diesem Fall int
. Daraus folgt, dass wenn der Wert für v1
ist null
, die if-Bedingung fehlschlägt, da null keinem zugewiesen werden kann int
. Richtiger null
ist kein int
.
Ich möchte hervorheben, dass diese Lösung möglicherweise nicht immer die optimale Wahl ist. Ich schlage vor, dass dies vom genauen Verwendungskontext des Entwicklers abhängt. Wenn Sie bereits ein haben int?
und dessen Wert nur dann bedingt bearbeiten möchten, wenn der zugewiesene Wert nicht null ist (dies ist das einzige Mal, dass es sicher ist, ein nullbares int in ein reguläres int umzuwandeln, ohne Informationen zu verlieren), dann Pattern Matching ist vielleicht eine der prägnantesten Möglichkeiten, dies zu tun.
HasValue
Schecks versehentlich umgestaltet werden.
In C # 7.1 und höher kann der Typ mithilfe des default
Literal anstelle des default
Operators abgeleitet werden, sodass er wie folgt geschrieben werden kann:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
istnull
?