2016-04-13 20 views
0

bunu yapmak çalışırsanız i cboş(c == null) sonra WriteLine() çıktılayacaktır null adlı eşitse söylüyorumNeden tipleri açısından eşleşmelidir: üçlü koşullu operatörü

// As an example. char? c value is actually given by the user. 
char? c = null; 

WriteLine((c == null) ? "null" : c); 

konsola. Else, c değerini vermelidir.

Ancak ben bu derleyici hatası alıyorum:

'string' ve char arasında hiçbir örtük dönüştürme olduğundan koşullu ifadenin türü tespit edilemeyen ?.

char? c = null;    
WriteLine((c == null) ? "null" : "{0}",c); 

Ya burada benzer derleyici hataları okumak, C 6. ve kullanma dize İnterpolasyon

char? c = null;    
WriteLine((c == null) ? "null" : $"{c}"); 

ile giriş stackoverflow örn:

Benim geçici çözüm bunu idi

Type of conditional expression cannot be determined because there is no implicit conversion between 'string' and 'System.DBNull'

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and <null>

veya nedeni türleri eşleşmelidir olduğunu söyler. Sorum şu, neden türlerin eşleşmesi gerekiyor? Ayrıca hata dize ve char arasında hiçbir dolaylı dönüşümü olmadığını söylüyor, bu dize char için açık bir dönüşüm olduğu anlamına mı geliyor? (ki bu açıkça mantıkla burada durum böyle olamaz) ya da char'dan geldiği anlamına mı geliyor? dize mi

cevap

2

Derleyici, ifade türünün ne olduğunu bilmek zorunda. Karaktere bir karakter ve bir işaretçi, aynı şey değildir.

Ne demek istediğinizi açıkça görüyorsunuz, ancak derleyici her ifadeye bir tür atamak zorundadır, bu nedenle WriteLine alt yordamının hangi sürümünün çağrılacağını bilecektir. Bu kararın çalışma zamanını erteleyemez - derleme zamanında karar vermek zorundadır, bu nedenle üçlü ifadenin ne tür olduğunu bilmek zorundadır.

+0

Teşekkürler ama biraz daha açıklayabilir misiniz? Çünkü derleyici (bana öyle geliyor) bir dizi ve bir karakter hakkında konuştuğumu biliyor mu? – Johnson

+0

@GeorgeOscStephan, derleyicinin seçmesini beklediğiniz "WriteLine" ın hangi aşırı yüküne karıştığımı karıştırdım. –

+0

@KirkWoll Hangi aşırı yüklenme hakkında ne demek istiyorsun? Derleyicinin null olması durumunda ilk ifadeyi seçmesini ve ikinci ifadeyi seçip çıktı almasını istiyorum. – Johnson