Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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çin
Ş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 önce
koleksiyon türünü belirler ve numaralandırıcı türü . Bu belirleme aşağıdaki gibi devam eder: öğe türü
Xtürü bir dizi türüyse,X'tenIEnumerablearabirimine örtük bir referans dönüştürmesi vardır (bu arabirimiSystem.Arrayuyguladığı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
Xtürüdynamicise, o zaman ifadesi’denIEnumerablearabirimine (§10.2.10) örtük bir dönüştürme vardır. koleksiyon türüIEnumerablearabirimidir ve numaralandırıcı türüIEnumeratorarabirimidir.tanımlayıcısı local_variable_type olarak verilirseöğe türü olur, aksi takdirde olur. Aksi takdirde, tür
X'ın uygun birGetEnumeratoryöntemi olup olmadığını belirleyin.
- Tür
Xüzerinde tanımlayıcıGetEnumeratorve 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.
Eyönteminin dönüş türüGetEnumeratorbir 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ıCurrentkullanı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ıMoveNextkullanı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, bu arabirimdir, koleksiyon türü numaralandırıcı türü arabirimidir ve öğe türü . Aksi takdirde, 'X' türünün uygun bir
GetEnumeratoruzantısı yöntemine sahip olup olmadığını belirleyin:
XtanımlayıcısıylaGetEnumeratortü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,
Xbir yapı türü ve referans türüinise ilk bağımsız değişkenin referansla geçirilmesine izin verir.Eyönteminin dönüş türüGetEnumeratorbir 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ıCurrentkullanı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ıMoveNextkullanı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.
C# feature specifications