2010-07-15 12 views
20

Geçtiğimiz günlerde, int? ile bir dizeyi birleştirdiğimde ve bundan sonra başka bir dizgi eklerken garip bir hatam vardı.Garip operatör önceliği ?? (null coletcing operatörü)

Kodum temelde bu eşdeğer oldu: will olarak, bu çalıştırmak ve uyarılar veya uyumsuz tip hatasız derlenir

int? x=10; 
string s = "foo" + x ?? 0 + "bar"; 

Şaşırtıcı ki bu:

int? x=10; 
string s = "foo" + x ?? "0" + "bar"; 

Ve sonra bu sonuçlanır Beklenmeyen bir tür uyumsuzluk hatası:

int? x=10; 
string s = "foo" + x ?? 0 + 12; 

Bu kadar basit olacak Örnek:

int? x=10; 
string s = "foo" + x ?? 0; 

Birisi bana bunun nasıl çalıştığını açıklayabilir mi? derler böylece her iki ifade dizelerdir Bu örnekte

int? x = 10; 
string s = ("foo" + x) ?? (0 + "bar"); 

ama istediğini yapmaz:

+0

İlgili bir konu: http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression/3218268#3218268 –

+0

Ve işte benim yanıtımı kızdırmayan bir bağlantıdır ... http://stackoverflow.com/questions/3218140/null-coalescing-operator-and-lambda-expression – ChaosPandion

cevap

25

boş kaynaştırma operatörü çok düşük precedence böylece kod olarak yorumlanır ediliyor etmiştir. Bir sonraki örnekte ?? operatörün sol tarafı bir dize, ancak derleme değil bu yüzden sağ taraf bir tam sayıdır:

int? x = 10; 
string s = "foo" + (x ?? 0) + "bar"; 
:

elbette çözüm parantez eklemek için
int? x = 10; 
string s = ("foo" + x) ?? (0 + 12); 
// Error: Operator '??' cannot be applied to operands of type 'string' and 'int' 

olduğunu

string s = ("foo" + x) ?? (0 + "bar"); 

Köknar:

+0

Ah bu nedenle düşük önceliği nedeniyle iki taraf neredeyse iki ayrı ifade – Earlz

+0

oluşturur, bu neden int int = 10; dize s = "foo" + x ?? "0"; 'o zaman çalışır – Earlz

10

?? operatör böylece ifadesi gerçekten olarak çalışır, + operatör daha precedence düşük sahiptir "foo" dizgisi ve x dizesi değeri birleştirilir ve eğer bu boş değerindeyse (bu olamaz), 0 dizesi değeri ve "bar" dizgisi birleştirilir.

+3

Fotoğraf bitti :) 1 saniye kazanın :) –