593 Stimmen

Wie konvertiert man C# nullable int in int

Wie konvertiere ich eine nullable int zu einer int ? Angenommen, ich habe 2 Arten von int wie unten:

int? v1;  
int v2; 

Ich möchte zuweisen v1 Wert auf v2 . v2 = v1; wird einen Fehler verursachen. Wie kann ich konvertieren v1 a v2 ?

4 Stimmen

Was ist das gewünschte Verhalten, wenn v1 es null ?

54voto

Guffa Punkte 663241

Wenn Sie wissen, dass v1 einen Wert hat, können Sie mit der Value Eigentum:

v2 = v1.Value;

Die Verwendung des GetValueOrDefault Methode wird der Wert zugewiesen, wenn es einen gibt, 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

Sie können die HasValue Eigenschaft zu prüfen, ob v1 hat einen Wert:

if (v1.HasValue) {
  v2 = v1.Value;
}

Außerdem gibt es Sprachunterstützung für die GetValueOrDefault(T) Methode:

v2 = v1 ?? -1;

31voto

Aniket Sharma Punkte 1008

GetValueOrDefault()

ruft den Wert des Objekts ab. Wenn es null ist, wird der Standardwert von int , also 0, zurückgegeben.

Beispiel:

v2= v1.GetValueOrDefault();

28voto

GrzegorzF Punkte 281

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 zurückgegebenen Wert wünschen (unabhängig davon, ob die Methode fehlgeschlagen ist oder nicht):

v2 = v1.GetValueOrDefault();

.NET 4.7.2.: GetValueOrDefault() gibt den Feldwert ohne Prüfung zurück.

19voto

Masoud Darvishian Punkte 3424

Meiner Meinung nach ist die beste Lösung die Verwendung von GetValueOrDefault() Methode.

v2 = v1.GetValueOrDefault();

19voto

Nicholas Miller Punkte 3905

Je nach Anwendungskontext können Sie die Pattern-Matching-Funktion von C# 7 verwenden:

int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

EDITAR:

Da einige Leute ohne eine Erklärung zu hinterlassen abwerten, möchte ich einige Details hinzufügen, um zu erklären, warum dies eine praktikable Lösung ist.

  • C# 7's Mustervergleich ermöglicht es uns nun, den Typ eines Wertes zu überprüfen und ihn implizit zu kodieren. Im obigen Schnipsel gilt die if-Bedingung nur dann, wenn der Wert, der in v1 ist typkompatibel mit dem Typ für v2 , die in diesem Fall lautet int . Daraus folgt, dass, wenn der Wert für v1 es null wird die if-Bedingung fehlschlagen, da Null nicht einem int . Richtig, null ist kein int .

  • Ich möchte darauf hinweisen, dass diese Lösung nicht immer die optimale Wahl ist. Wie ich bereits angedeutet habe, hängt dies vom genauen Nutzungskontext des Entwicklers ab. Wenn Sie bereits über eine int? und auf dessen Wert bedingte Operationen durchführen wollen wenn-und-nur-wenn der zugewiesene Wert nicht null ist (dies ist das einzige Mal, dass es sicher ist, einen nullable int in einen regulären int zu konvertieren, ohne Informationen zu verlieren), dann ist der Mustervergleich vielleicht eine der prägnantesten Möglichkeiten, dies zu tun.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X