Aracılığıyla paylaş


Vardiya operatörü gereksinimlerinin gevşetilmesi

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ında yakalanır.

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

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

Özet

Shift işleci gereksinimleri gevşetilecek, böylece sağ taraftaki işlenen artık yalnızca intolacak şekilde kısıtlanmayacaktır.

Motivasyon

intdışındaki türlerle çalışırken, leading zero counttemelinde kaydırma gibi başka bir hesaplamanın sonucunu kullanarak kaydırmanız sık karşılaşılan bir durum değildir. leading zero count gibi bir şeyin doğal türü giriş türüyle (TSelf) aynıdır ve bu nedenle çoğu durumda, bu sonuç zaten aralık içinde olsa bile, bu sonucu kaydırmadan önce int dönüştürmeniz gerekir.

Kütüphanelerin kullanıma sunmayı planladığı genel matematik arayüzleri bağlamında, tür iyi bilinmediğinden ve int'a dönüştürme mümkün veya iyi tanımlanamayabileceğinden bu potansiyel bir sorun olabilir.

Ayrıntılı tasarım

Shift işleçleri

§12.11 aşağıdaki gibi yeniden oluşturulmalıdır:

- When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration,
and the type of the second operand must always be int.
+ When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration.

Yani, ilk işlenenin işleç bildirimini içeren sınıf veya yapı olması kısıtlaması kalır. İkinci işlenenin int olması gerekliliği ortadan kaldırıldı.

İkili işleçler

§14.10.3 aşağıdaki gibi yeniden oluşturulmalıdır:

-*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?` and the second of which must have type `int` or `int?`, and can return any type.
+*  A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?`, and can return any type.

Diğer bir ifadeyle, ilk parametrenin T veya T? olması kısıtlaması devam eder. İkinci işlenenin int veya int? olması gereken kısıtlama kaldırıldı.

İkili işleç aşırı yükleme çözümlemesi

§11.4.5 ilk madde işareti aşağıdaki şekilde yeniden oluşturulmalıdır:

  • İşlem X için Y ve operator op(x,y) tarafından sağlanan aday kullanıcı tanımlı işleç kümesi belirlenir. Küme, işleç bir shift işleci olmadığı sürece ve tarafından sağlanan aday işleçlerinin birleşiminden oluşur tarafından sağlanan aday işleçleri her biri Aday kullanıcı tanımlı işleçler §11.4.6. X ve Y aynı türdeyse veya X ve Y ortak bir temel türden türetilmişse, paylaşılan aday işleçleri birleştirilmiş kümede yalnızca bir kez gerçekleşir.

Diğer bir ifadeyle, vardiya işleçleri için aday işleçleri yalnızca Xtürü tarafından sağlananlardır.

Dezavantaj -ları

Kullanıcılar, C# dilinde cout << "string" uygulama gibi önerilen yönergeleri izlemeyen işleçler tanımlayabilir.

Alternatif

Kitaplıklar tarafından kullanıma sunulan genel matematik arabirimleri bunun yerine açıkça adlandırılmış yöntemleri kullanıma açabilir. Bu, kodun okunmasını/bakımının daha zor olmasını sağlayabilir.

Genel matematik arabirimleri, vardiyanın int almasını ve bir dönüştürme yapılmasını gerektirebilir. Bu dönüştürme pahalı olabilir veya söz konusu türe bağlı olarak mümkün olmayabilir.

Çözülmemiş sorular

İkinci işlenenin neden intile kısıtlandığı konusundaki 'amacı' koruma konusunda endişe var mı?

Tasarım toplantıları

https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md