SORU
12 AĞUSTOS 2015, ÇARŞAMBA


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
12 AĞUSTOS 2015, ÇARŞAMBA


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • theatre2film

    theatre2film

    12 NİSAN 2006