2008-10-20 43 views
29

Ben örtük bir döküm başarısız neden olarak merak ediyorum boş olabilen türecan koşullu operatör örtük ...

int? someValue = SomeCondition ? ResultOfSomeCalc() : null; 

döküm ve ben neden açık döküm gerçekleştirmek yerine

değil neden
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null; 

Derleyici, dolaylı bir döküm kararı vermek için gereken tüm bilgilere sahip görünüyor, öyle değil mi? ? Arasında

ikinci ve üçüncü işlenen: operatör kontrolü koşullu ekspresyonu tipi

+5

Başlığınızı kendim düzenleyemem, ancak terimini terime göre değiştirmenizi öneririm - operatör koşullu operatör olarak adlandırılır. Bu, bir * üçlü operatördür - ve şu anda sadece bir tanesidir - ancak bu, işlenenlerin sayısından başka hiçbir şeyi açıklamamaktadır. –

+3

Belki ben cheekier, ama ben ... –

+0

@MarcGravell Arsız ve umarim ki doğru - başlık '** koşullu operatör' değil mi? :) –

cevap

27

C# 3.0 spec ilgili bölümü 7.13, koşullu operatördür. X ve Y, ikinci ve üçüncü işlenenlerin türleri olsun. Sonra,

Eğer X ve Y aynı türde ise, bu durumda koşulun türü Aksi takdirde, X'den Y'ye doğru bir dönüşüm (§6.1) varsa, Y'den X'e değil, Y ise koşullu ifadenin türü. Aksi takdirde, örtük bir dönüşüm (§6.1) Y'den X'e, ancak X'den Y'ye doğru değilse, X koşullu ifadenin türüdür. Aksi takdirde, ifade türü belirlenemez ve bir derleme zamanı hatası oluşur.

+6

Özet olarak, atadığınız türü hesaba katmaz. operasyonun sonucu. Sadece Nullable tiplerin cehaletiyle, denklemin tipinin sağ tarafını bulmaya çalışır. – TheSoftwareJedi

+0

Ama üçlü zincirleme durumunu ele alalım. Başka nasıl bilebilir ki? –

+0

@DJ Floetic: 'En içteki': operatörünü çalıştırır, bu sonucun türünü belirler, sonra çıkış yolunu çalışır. –

14

Ayrıca, özellikle bir değer türü olduğunda, atamaya göre türden çıkarım yapamayacağından rahatsızım. Nesne içine girdiğinizde nedenler var.

"ResultOfSomeCalc()" bir "int?" Döndürdüğünde, bu çalışır. C#, atamanın solunda ne olduğuna bakılmaksızın türü anlamaya ihtiyaç duyar. Yani, bir boş veya bir int dönüşü yapacağınızı söylüyorsunuz ve derleyicideki mantık, bir Null'ı bir ortak payda olarak ikame etmek için mevcut değil.

Bildirimi bu varyantlar işi DO ve anlamanıza yardımcı olabilir: Bu yardımcı olur

object someValue = true ? new Nullable<int>(ResultOfSomeCalc()) : null; 

object someValue = true ? (int?)ResultOfSomeCalc() : null; 

Umut. Fonksiyonun ResultofSomeCalc() int dönerse

+0

Ayrıca çok iyi bir cevap, DJ'leri kabul ettim ve sizinkini kabul ettim. –

0

Ayrıca bkz? o zaman bu işe yarayacak. Fonksiyonun int döndürürse

ardından derleyici uyarı verir: 'int' ve '' Bunu tahmin ediyorum
arasında hiçbir örtük dönüştürme olduğundan koşullu ifadenin Tipi tespit edilemeyen bir Gördüklerini . Koşullu işleçte "?:" Ifadesinin her iki ifadesi de aynı türe sahip olmalı veya örtülü bir yayınla aynı türe dönüştürülebilir olmalıdır.

ResultOfSomeCalc türünün int türünü int? Olarak değiştirin veya boş ifadenin boş ifadesine sahip olmanız gerekir.

5

Bu, derleyicinin kendisi için çözmesi gereken bir şey gibi görünüyor, ancak varsayılan anahtar kelimeyi kullanarak bunu yapmanın başka bir yolu var gibi görünüyor.

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?); 

varsayılan bu şekilde kullanılması iyi belgelenmiş olması görünmüyor, ama çalışır şudur: ufak biraz daha az çirkin döküm daha olabilir.En azından, kodunuzu sihirli değerler ile yıkmak zorunda kalmanıza engel olur (Ben null/zero/false/etc. 'In gerçekten sihirli değerler olduğunu iddia ediyorum).

0

ResultOfSomeCalc() 'nin dönüş türünü nullabel int türünde (int?)
int? someValue = (int?) Bazı Koşullar? ResultofSomeCalc(): (int?) Boş;