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
Özellik belirtimlerini C# dil standardına benimseme işlemi hakkında daha fazla bilgi edinmek için
Ş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 int
olacak şekilde kısıtlanmayacaktır.
Motivasyon
int
dışındaki türlerle çalışırken, leading zero count
temelinde 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
- İşlem
X
içinY
veoperator 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üreceve 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
veY
aynı türdeyse veyaX
veY
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 X
tü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 int
ile 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
C# feature specifications