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 ave bkesinlikle atanır. Dinamik yazmada karşılaşabileceğiniz tuhaflıklara rağmen, yalnızca her a <= biki TryParsearamayı 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 && Cki değerlendirir Ave Cancak Beğer sen kurnaz yeterli -. Neal Gafter'ın ustaca örneği için Roslyn hata raporuna bakın .
Bunu yapmak dynamicdaha 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 bbaş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 bonu 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 booliş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.
bbiroutparametre aracılığıyla atadıktan sonra kullanır .