Bu neden derlenmiyor?
int? number = true ? 5 : null;
'İnt' ve <null> arasında örtük dönüşüm olmadığından koşullu ifade türü belirlenemiyor
Bu neden derlenmiyor?
int? number = true ? 5 : null;
'İnt' ve <null> arasında örtük dönüşüm olmadığından koşullu ifade türü belirlenemiyor
Yanıtlar:
Spesifikasyon (§7.14), koşullu ifade için b ? x : y
, üç olasılık olduğunu x
ve y
her ikisinin de bir türü olduğunu ve belirli iyi koşulların karşılandığını, sadece bir tanesinin x
ve y
bir türünün olduğunu ve belirli iyi koşulların karşılandığını veya derleme zamanı hatası olduğunu söylüyor. oluşur. Burada, "belirli iyi koşullar", aşağıdaki ayrıntılara gireceğimiz belirli dönüşümlerin mümkün olduğu anlamına gelir.
Şimdi, spesifikasyonun alman kısmına bakalım:
Yalnızca biri
x
vey
türü varsa ve her ikisi dex
vey
dolaylı olarak bu türe dönüştürülebilirse, bu koşullu ifadenin türüdür.
Burada mesele şu ki
int? number = true ? 5 : null;
koşullu sonuçlardan yalnızca birinin bir türü vardır. İşte x
bir olan int
edebi ve y
olduğu null
yok ki değil bir türü var ve null
örtük bir dönüştürülebilir değildir int
1 . Bu nedenle, "belirli iyi koşullar" karşılanmaz ve derleme zamanı hatası oluşur.
Orada olan bu yaklaşık iki yolu vardır:
int? number = true ? (int?)5 : null;
Burada hala sadece bir tanesinin x
ve y
tipinin olduğu bir durumdayız . Not o null
hala bir türü yok henüz derleyici çünkü bu konuda herhangi bir sorun olmayacak (int?)5
ve null
her ikisi örtük olarak dönüştürülebilir olan int?
(§6.1.4 ve §6.1.5).
Diğer yol ise açıktır:
int? number = true ? 5 : (int?)null;
ama şimdi bunun neden iyi olduğunu anlamak için spesifikasyonda farklı bir madde okumalıyız :
Eğer
x
türü olanX
vey
türü vardırY
ardından
Örtülü bir dönüşüm (§6.1) den varsa
X
içinY
gelen, ancakY
içinX
, daha sonraY
koşullu ekspresyonu türüdür.Örtülü bir dönüşüm (§6.1) den varsa
Y
içinX
gelen, ancakX
içinY
, daha sonraX
koşullu ekspresyonu türüdür.Aksi takdirde, hiçbir ifade türü belirlenemez ve bir derleme zamanı hatası oluşur.
İşte x
türü int
ve y
türü int?
. Örtük dönüştürme yoktur int?
için int
, ancak bir örtük dönüştürme yoktur int
için int?
ifadenin türüdür yüzden int?
.
1 : Ayrıca, burada yaygın bir karışıklık kaynağı olan koşullu ifadenin türünü belirlerken sol tarafın türünün göz ardı edildiğine dikkat edin.
new int?()
yerine (int?)null
.
DateTime
bunu gerektirdiğinde veri aktarmaya çalıştığınızda da bu durum söz konusudur(DateTime?)
null
tanımlanabilir bir türü yoktur - mutlu etmek için sadece biraz ürüne ihtiyacı vardır:
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;
ve int? number = true ? (int?)5 : null;
her ikisi de derlemek !! Kazı kazan, çizik
Diğerlerinin de belirttiği gibi, 5 birdir int
ve null
dolaylı olarak dönüştürülemez int
.
Bu soruna geçici bir çözüm bulmak için başka yollar:
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
Ayrıca, gördüğünüz her yerde int?
de kullanabilirsiniz Nullable<int>
.
Bu C# 9
şimdi izin verilen blog
Hedef yazıldı ?? ve ?
Bazen şartlı ?? ve?: ifadelerin dallar arasında açık bir paylaşılan türü yoktur. Bu gibi durumlar bugün başarısız olur, ancak her iki dalın da dönüştüğü bir hedef türü varsa C # 9.0 onlara izin verir:
Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type
Veya örneğiniz:
// Allowed in C# 9.
int? number = true ? 5 : null;