Aracılığıyla paylaş


Yöntem grubu doğal tür iyileştirmeleri

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, ilgilidil tasarım toplantısı (LDM) notlarında yakalanır.

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

Şampiyon sorunu: https://github.com/dotnet/csharplang/issues/7429

Özet

Bu teklif, bir yöntem grubunun doğal türünün belirlenmesini birkaç şekilde iyileştirmektedir:

  1. Her kapsam için ayrı ayrı aday yöntemleri göz önünde bulundurun (önce örnek yöntemler, sonra her bir genişletme yöntemi kapsamı sırasıyla)
  2. Başarılı olma şansı olmayan adayları ayıklayarak benzersiz bir imza belirlemeyi engellemez:
    • Tür bağımsız değişkeni sağlanmayan genel örnek yöntemlerini kaldır (var x = M;)
    • Uzantıyı azaltmaya ve kısıtlamalara göre genel uzantı yöntemlerini ayıklama

Doğal türde yöntem grubu bağlamı

C# 10'da yöntem grupları zayıf bir doğal tür kazandı.
Bu tür, yalnızca yöntem grubu hedef türünden olmadığında devreye giren bir "zayıf türdür", yani System.Action a = MethodGroup;'da herhangi bir rol oynamaz.
Bu zayıf doğal tür, var x = MethodGroup;gibi senaryolara izin verir.

Referans için: https://github.com/dotnet/csharplang/blob/main/proposals/csharp-10.0/lambda-improvements.md#natural-function-type

Yöntem grubundaki tüm aday yöntemlerin ortak bir imzası varsa, yöntem grubu doğal bir türe sahiptir. (Yöntem grubu uzantı yöntemlerini içerebilirse, adaylar kapsayan türü ve tüm uzantı yöntemi kapsamlarını içerir.)

Pratikte bu, şu anlama gelir:

  1. Tüm aday yöntemleri kümesini oluşturun:
  • ilgili türdeki yöntemler, alıcı parametre bir tür olduğunda ve yöntem statik olduğunda veya alıcı parametre bir değer olduğunda ve yöntem statik olmadığında kümededir
  • azaltılabilir uzantı yöntemleri (tüm kapsamlar arasında) kümededir
  1. Tüm adayların imzaları eşleşmiyorsa, yöntem grubunun doğal bir türü yoktur
  2. Sonuçta elde edilen imzanın arity değeri sağlanan tür bağımsız değişkenlerinin sayısıyla eşleşmiyorsa, yöntem grubunun doğal bir türü yoktur
  3. Aksi takdirde, sonuçta elde edilen imza doğal tür olarak kullanılır

Teklif

İlke, aşırı yükleme çözümlemesinde de kullanılan aynı ilkeye dayanarak, kapsam kapsam ilerleyerek mümkün olan en kısa sürede başarılı olamayacağını bildiğimiz adayları elemek üzerine kuruludur.

  1. Her kapsam için tüm aday yöntemleri kümesini oluştururuz:
  • Başlangıç kapsamı için, sağlanan tür argümanlarıyla parametre sayısı eşleşen ve sağlanan tür argümanlarıyla kısıtlamaları karşılayan ilgili türdeki yöntemler, eğer statiklerse ve alıcı bir türse veya eğer statik değillerse ve alıcı bir değerse küme içindedir.
  • sonraki kapsamlar için, sağlanan tür bağımsız değişkenleriyle değiştirilebilen ve alıcının değeri kullanılarak kısıtlamaları karşılarken azaltılabilen bu kapsamdaki genişletme yöntemleri kümededir
  1. Verilen kapsamda hiç adayımız yoksa sonraki kapsama geçin.
  2. Tüm adayların imzaları eşleşmiyorsa, yöntem grubunun doğal bir türü yoktur
  3. Aksi takdirde, sonuçta elde edilen imza doğal tür olarak kullanılır
  4. Kapsamlar tükenirse yöntem grubunun doğal bir türü yoktur

Kapsama göre teklifle ilişkilidir: https://github.com/dotnet/csharplang/issues/7364 Genel uzantı yöntemlerini daha iyi işlemek için teklifle ilişkilidir: https://github.com/dotnet/roslyn/issues/69222