Odpowiedzi:
Wszystkie dotychczasowe odpowiedzi są poprawne; Chciałem tylko dodać jeszcze jeden, który jest nieco czystszy:
v2 = v1 ?? default(int);
Każde Nullable<T>
jest domyślnie konwertowalne na jego T
, ZAPEWNIONE, że całe oceniane wyrażenie nigdy nie może spowodować przypisania wartości NULL do ValueType. Tak więc operator zerowania koalescencyjnego ??
jest po prostu cukrem składniowym dla operatora trójskładnikowego:
v2 = v1 == null ? default(int) : v1;
... który z kolei jest składnią cukru dla if / else:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Ponadto, od .NET 4.0, Nullable<T>
ma metodę „GetValueOrDefault ()”, która jest zerowo bezpiecznym narzędziem pobierającym, które zasadniczo wykonuje koalescencję zerową pokazaną powyżej, więc to też działa:
v2 = v1.GetValueOrDefault();
default(int)
naprawdę jest potrzebny? Co jest złego w prostym 0
?
default
razie potrzeby. Zero nie zawsze jest poprawne jako wartość, a tym bardziej nie jest wartością domyślną, więc jeśli zamienisz int
na ogólny, T
zauważysz, że mój kod działa, a zero nie. W niektórych przyszłych wersjach ramowych default
może również stać się przeciążalny; jeśli i kiedy tak się stanie, kod korzystający z domyślnego kodu będzie mógł łatwo skorzystać, a jawne przypisania zerowe lub zerowe będą musiały zostać zmienione.
Lubię to,
if(v1.HasValue)
v2=v1.Value
Do przypisania można użyć właściwości Value.
v2 = v1.Value;
v1.HasValue
najpierw sprawdź .
Jeśli wiesz, że v1
ma wartość, możesz użyć Value
właściwości:
v2 = v1.Value;
Użycie GetValueOrDefault
metody spowoduje przypisanie wartości, jeśli istnieje, w przeciwnym razie wartość domyślna dla typu lub wartość domyślna, którą określisz:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Możesz użyć HasValue
właściwości, aby sprawdzić, czy v1
ma wartość:
if (v1.HasValue) {
v2 = v1.Value;
}
Istnieje również obsługa języka dla tej GetValueOrDefault(T)
metody:
v2 = v1 ?? -1;
Nie możesz tego zrobić, jeśli wersja 1 ma wartość NULL, ale możesz to sprawdzić u operatora.
v2 = v1 ?? 0;
GetValueOrDefault()
pobiera wartość obiektu. Jeśli ma wartość null, zwraca wartość domyślną int, która wynosi 0.
Przykład:
v2= v1.GetValueOrDefault();
Jeśli wartość domyślna dla danego typu jest akceptowalnym wynikiem:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Jeśli chcesz inną wartość domyślną, gdy wynik jest niezdefiniowany:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Jeśli chcesz tylko zwrócić wartość (bez względu na to, czy metoda zawiodła, czy nie):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
zwraca wartość pola bez sprawdzania.
Moim zdaniem najlepszym rozwiązaniem jest użycie GetValueOrDefault()
metody.
v2 = v1.GetValueOrDefault();
Zamiana int nullable na int może być wykonana w następujący sposób:
v2=(int)v1;
jest to możliwe dzięki v2 = Convert.ToInt32(v1);
Mógłbyś
v2 = v1.HasValue ? v1.Value : v2;
Prosta konwersja między v1
i v2
nie jest możliwa, ponieważ v1
ma większą domenę wartości niż v2
. To wszystko v1
może utrzymać plus null
państwo. Aby przekonwertować, musisz wyraźnie określić, jaka wartość int
zostanie użyta do zmapowania null
stanu. Najprostszym sposobem na to jest ??
operator
v2 = v1 ?? 0; // maps null of v1 to 0
Można to również zrobić w długiej formie
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
W zależności od kontekstu użytkowania możesz użyć funkcji dopasowania wzorców w C # 7:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Ponieważ niektórzy ludzie oddają głos bez pozostawienia wyjaśnienia, chciałbym dodać kilka szczegółów wyjaśniających uzasadnienie włączenia tego jako realnego rozwiązania.
Dopasowywanie wzorców w C # 7 pozwala nam teraz sprawdzić typ wartości i rzucić ją niejawnie. W powyższym fragmencie warunek if przejdzie tylko wtedy, gdy przechowywana wartość v1
jest zgodna z typem dla typu v2
, czyli w tym przypadku int
. Wynika z tego, że gdy wartość dla v1
jest null
, warunek if zakończy się niepowodzeniem, ponieważ nie można przypisać wartości null do zmiennej int
. Mówiąc dokładniej, null
nie jest int
.
Chciałbym podkreślić, że to rozwiązanie nie zawsze może być optymalnym wyborem. Jak sugeruję, uważam, że będzie to zależeć od dokładnego kontekstu użytkowania programisty. Jeśli masz już int?
i chcesz warunkowo operować na jej wartości, jeśli-i-tylko-jeśli przypisana wartość nie jest równa null (jest to jedyny czas, kiedy można bezpiecznie przekonwertować dopuszczalną wartość int na zwykłą liczbę int bez utraty informacji), to dopasowanie wzorca jest prawdopodobnie jednym z najbardziej zwięzłych sposobów na zrobienie tego.
HasValue
czeków.
W wersji C # 7.1 i nowszych typ można wywnioskować za pomocą default
literału zamiast default
operatora, dzięki czemu można go zapisać w następujący sposób:
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
jestnull
?