2013-06-28 23 views
5

Yakın zamanda bir merakı fark ettim (en azından benim için). null-coalescing operator'un herhangi bir matematiksel işlemden önce önceliği alacağını sanıyordum ama açıkçası yanılıyordum.Null birleştirme işlecini neden parantez içine koymam gerekiyor?

double? previousValue = null; 
double? v1 = 1 + previousValue ?? 0; 
double? v2 = 1 + (previousValue ?? 0); 

Ancak v2.Value (istenen) olan v1.Value ise 1 yine 0. neden: İki değişkenler aşağıdaki ucunda aynı değere sahip olacaktır düşünce? null coalescing operatör aslında nispeten düşük önceliğe sahiptir:

Demo

+0

yardımcı olabilir: http://en.csharp-online.net/ECMA-334%3a_14.2.1_Operator_precedence_and_associativity da http : //stackoverflow.com/questions/511093/what-is-the-operator-precedence-of-c-sharp-null-coalescing-operator – Ric

cevap

8

v1 Bahsettiğiniz kesin nedene 0'dır. This table tam olarak ne kadar düşük gösteriyor.

Yani ilk ekspresyon için, 1 + null ilk olarak değerlendirilir ve daha sonra ek olarak (previousValue == null 1 değeri 0 eklemek halinde, 1 söylediğini 0

1

v2 birleşir bir null int?, değerlendirir hangi 1.The v1 1 söylediğini artı boş yüzden geri vermek sağlayan null verir 0.

İlgili konular