Aracılığıyla paylaş


GetEnumerator uzantısı, foreach döngüleri için destek sağlar.

Not

Bu makale bir özellik belirtimidir. Belirtim, özelliğin tasarım belgesi olarak görev alır. Önerilen belirtim değişikliklerini ve özelliğin tasarımı ve geliştirilmesi sırasında gereken bilgileri içerir. Bu makaleler, önerilen belirtim değişiklikleri son haline getirilene ve geçerli ECMA belirtimine dahil edilene kadar yayımlanır.

Özellik belirtimi ile tamamlanan uygulama arasında bazı tutarsızlıklar olabilir. Bu farklılıklar, ilgili dil tasarım toplantısı (LDM) notlarındakaydedilir.

Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek içinbelirtimleri makalesinde bulabilirsiniz.

Şampiyonluk meselesi: https://github.com/dotnet/csharplang/issues/3194

Özet

foreach döngülerinin foreach desenini karşılayan bir uzantı yöntemini GetEnumerator yöntemini tanımasına izin verin ve aksi takdirde bir hata olduğunda ifadenin üzerinde döngü yapın.

Motivasyon

foreach'ın, asenkron ve desen tabanlı yapısızlaştırma dahil olmak üzere, C# içerisindeki diğer özelliklerle uyumlu hale getirilmesini sağlayacak.

Ayrıntılı tasarım

Belirtim değişikliği nispeten basittir. The foreach statement §13.9.5 bölümünü şu metinle değiştiririz:

Bir foreach deyiminin derleme zamanı işlemesi öncekoleksiyon türünü belirler numaralandırıcı türü ve öğe türü. Bu belirleme aşağıdaki gibi devam eder:

  • X türü bir dizi türüyse, X'ten IEnumerable arabirimine örtük bir referans dönüştürmesi vardır (bu arabirimi System.Array uyguladığından). koleksiyon türü arabirimi, numaralandırıcı türü arabirimi ve öğe türü dizi türünün öğe türüdür.

  • Eğer X türü dynamic ise, o zaman ifadesi’den IEnumerable arabirimine (§10.2.10) örtük bir dönüştürme vardır. koleksiyon türüIEnumerable arabirimidir ve numaralandırıcı türüIEnumerator arabirimidir. tanımlayıcısı local_variable_type olarak verilirse öğe türü olur, aksi takdirde olur.

  • Aksi takdirde, tür X'ın uygun bir GetEnumerator yöntemi olup olmadığını belirleyin.

    • Tür X üzerinde tanımlayıcı GetEnumerator ve hiçbir tür bağımsız değişkeni olmadan üye araması gerçekleştirin. Üye araması bir eşleşme üretmiyorsa veya bir belirsizlik veya yöntem grubu olmayan bir eşleşme üretirse, aşağıda açıklandığı gibi numaralandırılabilir bir arabirim olup olmadığını denetleyin. Üye arama bir yöntem grubu dışında bir şey üretirse veya eşleşme yoksa bir uyarı verilmesi önerilir.
    • Elde edilen yöntem grubunu ve boş bir bağımsız değişken listesini kullanarak aşırı yükleme çözümlemesi gerçekleştirin. Aşırı yükleme çözümlemesi geçerli bir yöntemle sonuçlanmıyorsa, belirsizlikle sonuçlanıyorsa veya tek bir en iyi yöntemle sonuçlanıyorsa ancak bu yöntem statikse veya genel değilse, aşağıda açıklandığı gibi numaralandırılabilir bir arabirim olup olmadığını denetleyin. Aşırı yükleme çözümlemesi belirsiz bir genel örnek yöntemi dışında bir şey üretirse veya geçerli yöntem yoksa bir uyarı verilmesi önerilir.
    • E yönteminin dönüş türü GetEnumerator bir sınıf, yapı veya arabirim türü değilse, bir hata oluşturulur ve başka adım atılmaz.
    • Üye arama, E üzerinde, tanımlayıcı Current kullanılarak ve tür bağımsız değişkeni olmaksızın gerçekleştirilir. Üye araması eşleşme sağlamazsa veya sonuç, okumaya izin veren bir genel örnek özelliği dışında bir şeyse, bir hata oluşturulur ve başka bir adım atılmaz.
    • Üye arama, E üzerinde, tanımlayıcı MoveNext kullanılarak ve tür bağımsız değişkeni olmaksızın gerçekleştirilir. Üye araması bir eşleşme sağlamazsa veya sonuç bir yöntem grubu değilse, bir hata oluşur ve başka adım atılmaz.
    • Aşırı yükleme çözümlemesi, yöntem grubunda boş bir bağımsız değişken listesiyle gerçekleştirilir. Aşırı yükleme çözümlemesi geçerli bir yöntemle sonuçlanmazsa, belirsizlikle sonuçlanırsa veya tek bir en iyi yöntemle sonuçlanırsa, ancak bu yöntem statik veya genel değilse ya da dönüş türü booldeğilse, bir hata oluşturulur ve başka bir adım atılmaz.
    • koleksiyon türü , numaralandırıcı türü ve öğe türü özelliğinin türüdür.
  • Aksi takdirde, numaralandırılabilir bir arabirim olup olmadığını denetleyin:

    • 'den 'a örtük dönüştürmenin olduğu tüm türler arasında , olmayan benzersiz bir tür ve diğer tüm 'den 'e örtük bir dönüştürme varsa, koleksiyon türü arabirimidir. numaralandırıcı türü arabirimidir ve öğe türü .
    • Aksi takdirde, Tbirden fazla tür varsa bir hata oluşturulur ve başka bir adım atılır.
    • Aksi takdirde, 'den arabirimine örtük bir dönüştürme varsa, koleksiyon türü bu arabirimdir, numaralandırıcı türü arabirimidir ve öğe türü .
  • Aksi takdirde, 'X' türünün uygun bir GetEnumerator uzantısı yöntemine sahip olup olmadığını belirleyin:

    • Xtanımlayıcısıyla GetEnumerator türünde uzantı yöntemi araması gerçekleştirin. Üye araması bir eşleşme üretmezse veya bir belirsizlik üretirse veya yöntem grubu olmayan bir eşleşme üretirse, bir hata oluşturulur ve başka bir adım atılmaz. Üye arama bir yöntem grubu dışında bir şey üretirse veya eşleşme yoksa bir uyarının sorun olması önerilir.
    • Elde edilen yöntem grubunu ve Xtüründe tek bir bağımsız değişkeni kullanarak aşırı yükleme çözümlemesi gerçekleştirin. Aşırı yükleme çözümlemesi geçerli bir yöntem üretmiyorsa, belirsizliğe neden oluyorsa veya tek bir en iyi yöntemle sonuçlanıyorsa ancak bu yöntem erişilemiyorsa, başka bir adım atılmaz.
      • Bu çözünürlük, X bir yapı türü ve referans türü inise ilk bağımsız değişkenin referansla geçirilmesine izin verir.
    • E yönteminin dönüş türü GetEnumerator bir sınıf, yapı veya arabirim türü değilse, bir hata oluşturulur ve başka adım atılmaz.
    • Üye arama, E üzerinde, tanımlayıcı Current kullanılarak ve tür bağımsız değişkeni olmaksızın gerçekleştirilir. Üye araması eşleşme sağlamazsa veya sonuç, okumaya izin veren bir genel örnek özelliği dışında bir şeyse, bir hata oluşturulur ve başka bir adım atılmaz.
    • Üye arama, E üzerinde, tanımlayıcı MoveNext kullanılarak ve tür bağımsız değişkeni olmaksızın gerçekleştirilir. Üye araması bir eşleşme sağlamazsa veya sonuç bir yöntem grubu değilse, bir hata oluşur ve başka adım atılmaz.
    • Aşırı yükleme çözümlemesi, yöntem grubunda boş bir bağımsız değişken listesiyle gerçekleştirilir. Aşırı yükleme çözümlemesi geçerli bir yöntemle sonuçlanmazsa, belirsizlikle sonuçlanırsa veya tek bir en iyi yöntemle sonuçlanırsa, ancak bu yöntem statik veya genel değilse ya da dönüş türü booldeğilse, bir hata oluşturulur ve başka bir adım atılmaz.
    • koleksiyon türü , numaralandırıcı türü ve öğe türü özelliğinin türüdür.
  • Aksi takdirde bir hata oluşturulur ve başka bir adım atılmaz.

await foreachiçin kurallar benzer şekilde değiştirilir. Bu belirtim için gerekli olan tek değişiklik, Extension methods do not contribute. satırını açıklamadan kaldırmaktır, bu belirtimin geri kalanı desen yöntemleri yerine farklı adlarla yukarıdaki kuralları temel alır.

Dezavantaj -ları

Her değişiklik dile daha fazla karmaşıklık ekler ve bu, foreachgibi foreached Rangeolacak şekilde tasarlanmamış şeylere olanak tanır.

Alternatif

Hiçbir şey yapmıyor.

Çözülmemiş sorular

Şu anda yok.