SORU
1 AĞUSTOS 2009, CUMARTESİ


C# neden't isimsiz bir yöntem verim bir açıklama içerebilir?

Bu lambda kapasiteli bir dönüş yapıyor () gibi bir şey yapmak güzel olur diye düşündüm:

public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
    IList<T> list = GetList<T>();
    var fun = expression.Compile();

    var items = () => {
        foreach (var item in list)
            if (fun.Invoke(item))
                yield return item; // This is not allowed by C#
    }

    return items.ToList();
}

Ancak, anonim yönteminde verim kullanamam öğrendim. Neden merak ediyorum. yield docs sadece izin verilmez söylüyorlar.

İzin olmadığı için ben sadece Listeyi oluşturan öğeler ekledi.

CEVAP
1 AĞUSTOS 2009, CUMARTESİ


Eric Lippert son zamanlarda verim bazı durumlarda izin verilmez neden hakkında blog yazıları bir dizi yazdı.

EDİT2:

  • Part 7(bu bir sonraki yayınlanmıştır ve özellikle bu soruyu adresleri)

Muhtemelen cevabı orada bulacaksınız


EDİT1: bu Eric'in Patel yorum Abhijeet cevap 5 Parçası: yorum olarak açıklanmıştır

Q :

Eric,

Ayrıca içine biraz fikir verebilir misiniz neden" içeri giremez "verim anonim yöntem veya lambda ifadesi

Bir :

Güzel soru. Sahip olmak isterdim anonim yineleyici engeller. Olur muhteşem inşa edebilmek için kendine bir sıra jeneratör üzerinde kapalı alan yerinde yerel değişkenler. Neden olmasın nedeni basit: faydaları yok maliyeti daha ağır. Bu muhteşemlik yapma sırası jeneratörler yerinde. aslında oldukça küçük grand şeyler ve nominal yöntemler düzeni işini iyi en yeterli yapmak senaryolar. Faydaları değil yani bu oldukça zorlayıcı.

Maliyeti büyük. Yineleyici yeniden en karmaşık olanı dönüşüm derleyici ve anonim yöntemdir yeniden yazma ikinci en karmaşık. Anonim yöntemleri içinde diğer anonim olabilir yöntemleri ve anonim yöntemler olabilir içinde yineleyici engeller. Bu nedenle, ne yaptığımız ilk olduğunu hepimiz yeniden olurlar anonim yöntemler yani kapatma sınıfının yöntemleri. Bu ikinci son şey derleyici bir yöntem için IL yayan yapmadan önce. Bu adım tamamlandığında, yineleyici wireless yok varsayabiliriz yineleyici, anonim yöntemleri block; yazılmış hepsi zaten. Bu nedenle yineleyici wireless sadece konsantre olabilir yineleyici yeniden olmadan olabileceğini de endişe verici orada gerçekleşmemiş anonim yöntemi.

Ayrıca, yineleyici bloğu asla "", yuva anonim yöntemleri farklı. Yineleyici wireless tüm yineleyici varsayabiliriz taşlarıdır "". üst düzey

Anonim yöntemler için izin verilirse yineleyici blok, her ikisi de içerir bu varsayımlar çöpe gider. Yineleyici bir blok olabilir anonim bir yöntem içerir anonim bir yöntem içerir yineleyici bir blok içerir içeren isimsiz bir yöntem, ve... iğrenç. Şimdi yeniden yazmalıyız iç içe geçmiş yineleyici işleyebilir pass ve takozları iç içe anonim yöntemleri aynı zamanda, bizim iki en birleştirme bir çok karmaşık algoritmaları algoritma daha karmaşık. Olur gerçekten zor tasarlamak, uygulamak, ve test. Ne kadar zeki olduğumuzu yani, eminim. Akıllı bir ekip var burada. Ama almak istemiyoruz bir "olması güzel için büyük yük ama gerekli değil" özelliği. -- Eric

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jeremy Gallman

    Jeremy Gallm

    11 NİSAN 2012
  • laptopmag

    laptopmag

    25 Ocak 2008
  • Rootjunky.com

    Rootjunky.co

    22 EKİM 2011