Roslyn kodu derlemek için başarısız oldu
VS2015 için VS2013 benim proje geçirildikten sonra proje artık oluşturur. Derleme bir hata takip ETMENİZ deyiminde oluşur:
static void Main(string[] args)
{
decimal a, b;
IEnumerable<dynamic> array = new string[] { "10", "20", "30" };
var result = (from v in array
where decimal.TryParse(v, out a) && decimal.TryParse("15", out b) && a <= b // Error here
orderby decimal.Parse(v)
select v).ToArray();
}
Derleyici hata verir:
Atanmamış yerel değişken hata CS0165 Kullanın 'b'
Bu sorun ne neden olur? Derleyici bir ayar ile bunu düzeltmek mümkün mü?
CEVAP
Neden bu sorun nedir?
Bana derleyici bir hata gibi görünüyor. En azından bunu yaptı. decimal.TryParse(v, out a)
decimal.TryParse(v, out b)
ifadeler dinamik olarak değerlendirilir ancakbeklendiğizaman a <= b
, a
b
hem ulaşana hala anlamak için derleyici kesinlikle atanır. Hatta dinamik daktilo ile gelmek weirdnesses, sadece TryParse
çağrıları her iki değerlendirdikten sonra a <= b
değerlendirmek için beklerdim.
Ancak, bu çıkıyor ile operatör ve dönüşüm zor, tamamen verimli bir ifadesi A && B && C
değerlendirir A
C
B
- eğer yeterince kurnaz. Roslyn bug report Neal Gafter için dahiyane örneğe bakın.
Yapım çalışmaları ile dynamic
daha da zor - semantiği ilgili işlenen dinamik olan sert, tarif, çünkü gerçekleştirmek amacıyla aşırı çözümleme, değerlendirme işlenen bulmak için ne tür dahil edilebilir karşı sezgisel. Ancak, yine Neal derleyici hata gerekli olduğunu gösteren bir örnek... bu bir hata değil, bir hatadüzeltme. Bunu kanıtlamak için Neal şeref büyük miktarlarda.
Derleyici ayarları ile bunu düzeltmek mümkün mü?
Hayır, ama hata önlemek hangi alternatifler vardır.
Birincisi, dinamik olmak onu durdurabilirsin - eğer sadece dizeleri kullanacağınızı biliyorsanız, o zaman IEnumerable<string>
kullanabilirsinizyaAralık değişkeni v
string
(yani from string v in array
) Bir tür verin. Bu benim tercih edilen seçenek olacaktır.
Eğergerçektenbu dinamik tutmak gerekir, sadece b
başlangıç değeri vermek:
decimal a, b = 0m;
Bu herhangi bir zarar vermez - bunu biliyoruzaslındadinamik değerlendirme çılgınca bir şey yapmaz, yine de kullanmadan önce b
değer atamak başlangıç değeri boş gezenin boş kalfası bitireceğiz.
Ayrıca, parantez ekleyerek çok çalışıyor gibi görünüyor:
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
Ta ki aşırı çözümleme birbirinden ayırmak da devreye girdiği nokta değişiklikler ve derleyici mutlu olur.
Varbirsorun hala kalan - spec kuralları üzerinde kesin atamasıyla &&
operatör olmalı açıklık için devlet onlar sadece uygulamak &&
operatör kullanılıyor onun "normal" uygulaması ile iki bool
işlenen. Bu önümüzdeki ECMA standart sabit olduğundan emin olmak için çalışacağım.
Hata Kodu 403 ölümcül dönen Gıt için b...
Basamaklı örnekler derlemek için başar...
Doğrulama başarısız oldu geçersiz veya...
Mysql2 yükleme: hata gem yerel uzantı ...
Doğrulama, bir veya daha fazla varlıkl...