Bu soruna ne sebep olur?
Bana bir derleyici hatası gibi görünüyor. En azından yaptı. Her ne kadar decimal.TryParse(v, out a)
ve decimal.TryParse(v, out b)
ifadeler dinamik değerlendirilir, ben beklenen derleyici hala anlamak için o ulaştığında a <= b
, hem a
ve b
kesinlikle atanır. Dinamik yazmada karşılaşabileceğiniz tuhaflıklara rağmen, yalnızca her a <= b
iki TryParse
aramayı da değerlendirdikten sonra değerlendirmeyi bekliyorum .
Ancak, operatör ve zor dönüşüm yoluyla, bir ifadeye sahip tamamen mümkün olduğunu çıkıyor A && B && C
ki değerlendirir A
ve C
ancak B
eğer sen kurnaz yeterli -. Neal Gafter'ın ustaca örneği için Roslyn hata raporuna bakın .
Bunu yapmak dynamic
daha da zor - işlenenler dinamik olduğunda dahil olan anlambilimin açıklanması daha zordur, çünkü aşırı yük çözümlemesini gerçekleştirmek için hangi türlerin dahil olduğunu bulmak için işlenenleri değerlendirmeniz gerekir, bu da sezgiye aykırı olabilir. Ancak yine Neal, derleyici hatasının gerekli olduğunu gösteren bir örnek buldu ... bu bir hata değil, bir hata düzeltmesi . Bunu kanıtladığı için Neal'a büyük miktarda övgü
Derleyici ayarları aracılığıyla düzeltmek mümkün mü?
Hayır, ancak hatayı engelleyen alternatifler var.
İlk olarak, dinamik olmasını engelleyebilirsiniz - eğer sadece dizeleri kullanacağınızı biliyorsanız, o zaman aralık değişkenini kullanabilir IEnumerable<string>
veyav
bir tür string
(ie from string v in array
) verebilirsiniz . Bu benim tercih ettiğim seçenek olurdu.
Eğer varsa gerçekten o dinamik tutmak için gereken, sadece vermek b
başlangıç için bir değer:
decimal a, b = 0m;
Bunun herhangi bir zararı olmayacak - aslında dinamik değerlendirmenizin çılgınca bir şey yapmayacağını biliyoruz, bu yüzden b
onu kullanmadan önce bir değer atayarak başlangıç değerini geçersiz kılacaksınız.
Ek olarak, parantez eklemek de işe yarıyor gibi görünüyor:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
Bu, çeşitli aşırı yük çözümleme parçalarının tetiklendiği noktayı değiştirir ve derleyiciyi mutlu eder.
Hala bir sorun var - &&
operatörle kesin atamayla ilgili spesifikasyon kurallarının, yalnızca &&
operatör iki bool
işlenenle "normal" uygulamasında kullanıldığında geçerli olduklarını belirtmek için açıklığa kavuşturulması gerekir . Bunun bir sonraki ECMA standardı için düzeltildiğinden emin olmaya çalışacağım.
b
birout
parametre aracılığıyla atadıktan sonra kullanır .