Yanıtlar:
Şimdiye kadar olan diğer cevapların hepsi doğrudur; Sadece biraz daha temiz olan bir tane daha eklemek istedim:
v2 = v1 ?? default(int);
Herhangi Nullable<T>
biri dolaylı olarak onun dönüştürülebilir T
, değerlendirilen tüm ifade hiçbir zaman bir ValueType için boş bir atama ile sonuçlanamaz. Yani, boş birleştirici operatör ??
üçlü operatör için sadece sözdizimi şekeri:
v2 = v1 == null ? default(int) : v1;
... bir if / else için sözdizimi şekeri olan:
if(v1==null)
v2 = default(int);
else
v2 = v1;
Ayrıca, .NET 4.0'dan itibaren, Nullable<T>
temel olarak yukarıda gösterilen null birleştirme işlemini gerçekleştiren bir null-güvenli alıcı olan "GetValueOrDefault ()" yöntemine sahiptir, bu yüzden bu da işe yarar:
v2 = v1.GetValueOrDefault();
default(int)
gerçekten gerekli? Bir basit ile ilgili sorun nedir 0
?
default
uygun olan yerlerde kullanılması önerilir . Sıfır her zaman bir değer olarak geçerli değildir, çok daha az varsayılan değerdir, bu nedenle int
bir jenerik ile değiştirirseniz , T
kodum sıfır olmadan çalışmaz. Gelecekteki bazı çerçeve versiyonlarında, default
yüklenebilir de olabilir; bu gerçekleşirse ve olduğunda, varsayılan kullanım kodundan kolayca faydalanılırken açık null veya sıfır atamaların değiştirilmesi gerekir.
Bunun gibi,
if(v1.HasValue)
v2=v1.Value
Atama için Value özelliğini kullanabilirsiniz.
v2 = v1.Value;
v1.HasValue
.
Bunun v1
bir değeri olduğunu biliyorsanız , Value
özelliği kullanabilirsiniz :
v2 = v1.Value;
GetValueOrDefault
Yöntemin kullanılması, varsa bir değer atayacaktır, aksi takdirde tür için varsayılan veya belirttiğiniz varsayılan bir değer atanacaktır:
v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value
v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value
Değeri HasValue
olup olmadığını kontrol etmek için özelliği kullanabilirsiniz v1
:
if (v1.HasValue) {
v2 = v1.Value;
}
GetValueOrDefault(T)
Yöntem için dil desteği de vardır :
v2 = v1 ?? -1;
V1 boşsa yapamazsınız, ancak bir operatörle kontrol edebilirsiniz.
v2 = v1 ?? 0;
GetValueOrDefault()
nesnenin değerini alır. Boşsa, int olan varsayılan değeri olan 0 değerini döndürür.
Misal:
v2= v1.GetValueOrDefault();
Belirli bir tür için varsayılan değer kabul edilebilir bir sonuçsa:
if (v1.HasValue)
v2 = v1.GetValueOrDefault();
Sonuç tanımsız olduğunda farklı bir varsayılan değer istiyorsanız:
v2 = v1.GetValueOrDefault(255); // or any valid value for int in place of 255
Yalnızca değerin döndürülmesini istiyorsanız (yöntem başarısız olsa da olmasa da):
v2 = v1.GetValueOrDefault();
.NET 4.7.2 .: GetValueOrDefault()
herhangi bir denetim yapmadan alan değerini döndürür.
Ben endişeliyim kadarıyla en iyi çözüm GetValueOrDefault()
yöntemi kullanmaktır .
v2 = v1.GetValueOrDefault();
İnt dönüşümü nullable aşağıdaki gibi yapılabilir:
v2=(int)v1;
ile mümkün v2 = Convert.ToInt32(v1);
Yapabilirsin
v2 = v1.HasValue ? v1.Value : v2;
Arasında basit bir dönüştürme v1
ve v2
nedeniyle mümkün değildir v1
daha değerlerin daha geniş bir alana sahiptir v2
. Her şey v1
artı null
devlet tutabilir . Dönüştürmek int
için, null
durumu eşlemek için hangi değerin kullanılacağını açıkça belirtmeniz gerekir . Bunu yapmanın en basit yolu ??
operatördür
v2 = v1 ?? 0; // maps null of v1 to 0
Bu aynı zamanda uzun formda da yapılabilir
int v2;
if (v1.HasValue) {
v2 = v1.Value;
} else {
v2 = 0;
}
Kullanım içeriğinize bağlı olarak, C # 7'nin desen eşleme özelliğini kullanabilirsiniz:
int? v1 = 100;
if (v1 is int v2)
{
Console.WriteLine($"I'm not nullable anymore: {v2}");
}
Bazı insanlar açıklama yapmadan aşağı oy kullandıklarından, bunu uygulanabilir bir çözüm olarak dahil etmenin mantığını açıklamak için bazı ayrıntılar eklemek istiyorum.
C # 7'nin desen eşleşmesi artık bir değerin türünü kontrol etmemizi ve bunu dolaylı olarak yayınlamamızı sağlıyor. Yukarıdaki snippet'te, if koşulu yalnızca içinde depolanan değer v1
türüne uygun olduğunda v2
(bu durumda) geçer int
. Bunun sonucu, değeri v1
olduğunda null
, n- öğesinin null değerine atanamadığı için if-koşulunun başarısız olacağı sonucu çıkar int
. Daha düzgün, null
bir değil int
.
Bu çözümün her zaman en uygun seçenek olmadığını vurgulamak isterim. Önerdiğim gibi, bunun geliştiricinin tam kullanım bağlamına bağlı olacağına inanıyorum. Atanmış değer null değilse zaten bir int?
ve varsa koşullu olarak değeri üzerinde çalışmak istiyorsanız (bu, boş bir int'i bilgi kaybetmeden normal bir int'e dönüştürmenin güvenli olduğu tek zamandır), örüntü eşleştirme belki de bunu yapmanın en kısa yollarından biridir.
HasValue
çeklerinizi yanlışlıkla yeniden düzenleme riski yoktur .
C # 7.1 ve sonraki sürümlerde tür , operatör yerine default
değişmez değer kullanılarak çıkarılabilir, böylece aşağıdaki gibi yazılabilir:default
v2 = v1 ?? default;
int v2= Int32.Parse(v1.ToString());
v1
olduğunull
?