SORU
16 ŞUBAT 2013, CUMARTESİ


Dosyalarda grup değişken için erişim kapatma uyarısı

Aşağıdaki uyarıyı alıyorum:

Kapatılması dosyalarda grup değişken için erişim. Mayıs derleyici farklı sürümleri ile derlenmiş, farklı davranışları var.

Bu gibi editörüm görünüyor

abovementioned error message in a hover popup

Bu uyarı düzeltmek nasıl biliyorum, ama neden olsun ki biliyorum bu uyarı istiyorum?

Bu konuda "CLR" sürüm? İlgili "IL"?

CEVAP
17 ŞUBAT 2013, Pazar


Bu uyarı iki bölümü vardır. İlk

Kapatılması dosyalarda grup değişken için erişim

...geçersiz karşı sezgisel ilk bakışta önemlidir ama tek başına değildir. Ayrıca çok zor değil. (Ben link aşağıdaki makale bu açıklar o kadar ki,"".) zararlı

Sorgunuzu, bölümünden olduğunuz kod temelde ne C genişletilmiş bir formu olduğunu belirterek, al# derleyicisi C# 5 önce () foreach oluşturur1:

[Yok] neden [şudur] geçerli değil anlayın:

string s; while (enumerator.MoveNext()) { s = enumerator.Current; ...

Peki, sözdizimsel olarak geçerli. Ve eğer tüm döngü içinde gidiyor eğer kullanıyordeğers Her şey iyi olur o zaman. Ama s üzerinde kapanış mantıksız davranışlara yol açacaktır. Aşağıdaki kodu bir göz atın:

var countingActions = new List<Action>();

var numbers = from n in Enumerable.Range(1, 5)
              select n.ToString(CultureInfo.InvariantCulture);

using (var enumerator = numbers.GetEnumerator())
{
    string s;

    while (enumerator.MoveNext())
    {
        s = enumerator.Current;

        Console.WriteLine("Creating an action where s == {0}", s);
        Action action = () => Console.WriteLine("s == {0}", s);

        countingActions.Add(action);
    }
}

Eğer bu kodu çalıştırırsanız, aşağıdaki çıktıyı konsol: var

Creating an action where s == 1
Creating an action where s == 2
Creating an action where s == 3
Creating an action where s == 4
Creating an action where s == 5

Bu ne bekliyordunuz.

Muhtemelen beklemeyin bir şey görmek için aşağıdaki kodu çalıştırınhemen sonrayukarıdaki kod:

foreach (var action in countingActions)
    action();

Aşağıdaki konsol çıktısını alırsınız:

s == 5
s == 5
s == 5
s == 5
s == 5

Neden? Hepsi aynı işi görüyor bu beş fonksiyonları yarattık, çünkü: baskı s değeri üzerine kapattık. Gerçekte, aynı işlevi onlar ("s", "s", "s"...)Yazdır. Yazdır

Hangi tam olarak ne biz onlardan, onlar kullanmak için gidiyoruz noktasında: yazdırma s değeri. Eğer s son bilinen değeri bakarsanız 5 olduğunu göreceksiniz. Konsola s == 5 beş kez bastık.

İstediğimiz tam olarak, ama muhtemelen istediğimiz şey değil.

Uyarı ikinci bölümü...

Mayıs derleyici farklı sürümleri ile derlenmiş, farklı davranışları var.

...ne olduğudur. Starting with C# 5, the compiler generates different code that "prevents" this from happening via foreach.

Böylece aşağıdaki kodu derleyici farklı sürümleri altında farklı sonuçlar verir

foreach (var n in numbers)
{
    Action action = () => Console.WriteLine("n == {0}", n);
    countingActions.Add(action);
}

Sonuç olarak, aynı zamanda R üretecek# uyarı :)

Benim ilk kod parçası yukarıda olacak sergi aynı davranışı tüm sürümleri derleyici yana değilim kullanma foreach (yerine koydum genişletilmiş çıkış öncesi C# 5 Derleyiciler).

Bunun için CLR versiyonu mu?

Burada ne sorduğunuzu tam olarak emin değilim.

Eric Lippert sonrası değişiklik olur "diyor C# 5". Yani tahminen hedef var .4.5 veya daha yeni bir davranış, ve eski davranış her şeyden önce# 5 veya daha yeni bir C derleyici ile NET.

Ama açık olalım, derleyici bir işlev değil .NET çatısı sürüm.

IL ile ilgisi var mı?

Farklı kod farklı IL bu anlamda İL için oluşturulan sonuçları var bu yüzden üretir.

1foreach bir çok daha sık yorum yayınladığınızı kod yapısı. Bu sorun genellikle manuel sayım ile foreach, kullanımı ile ortaya çıkar. Bu C foreach# 5 değişiklikleri bu sorunu önlemek yardımcı, ama tamamen değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ElChakotay Andrich

    ElChakotay A

    10 EKİM 2013
  • FailArmy U

    FailArmy U

    29 AĞUSTOS 2009
  • Metheud

    Metheud

    9 EYLÜL 2006