Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Nota
Artikel ini adalah spesifikasi fitur. Spesifikasi berfungsi sebagai dokumen desain untuk fitur tersebut. Ini termasuk perubahan spesifikasi yang diusulkan, bersama dengan informasi yang diperlukan selama desain dan pengembangan fitur. Artikel ini diterbitkan sampai perubahan spesifikasi yang diusulkan diselesaikan dan dimasukkan dalam spesifikasi ECMA saat ini.
Mungkin ada beberapa perbedaan antara spesifikasi fitur dan implementasi yang selesai. Perbedaan tersebut terdapat dalam catatan rapat desain bahasa (LDM) terkait .
Anda dapat mempelajari lebih lanjut tentang proses untuk mengadopsi speklet fitur ke dalam standar bahasa C# dalam artikel tentang spesifikasi .
Masalah juara: https://github.com/dotnet/csharplang/issues/4666
Ringkasan
Persyaratan operator shift akan dilonggarkan sehingga operand di sebelah kanan tidak lagi dibatasi hanya int
.
Motivasi
Saat bekerja dengan jenis selain int
, tidak jarang Anda beralih menggunakan hasil komputasi lain, seperti pergeseran berdasarkan leading zero count
. Jenis alami sesuatu seperti leading zero count
sama dengan jenis input (TSelf
) dan dalam banyak kasus, ini mengharuskan Anda untuk mengonversi hasil tersebut menjadi int
sebelum bergeser, bahkan jika hasil itu sudah dalam rentang.
Dalam konteks antarmuka matematika generik yang akan diekspos pustaka, ini berpotensi bermasalah karena jenisnya tidak dikenal dan sehingga konversi ke int
mungkin tidak mungkin atau bahkan terdefinisi dengan baik.
Desain terperinci
Operator Pergeseran
§12.11 harus diungkapkan kembali sebagai berikut:
- 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.
Artinya, pembatasan bahwa operan pertama menjadi kelas atau struktur yang berisi deklarasi operator tetap ada.
Sementara pembatasan bahwa operand kedua harus int
dihapus.
Operator biner
§14.10.3 harus ditulis ulang sebagai berikut:
-* 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.
Artinya, pembatasan bahwa parameter pertama T
atau T?
tetap ada.
Sementara pembatasan bahwa operand kedua harus int
atau int?
dihapus.
Resolusi kelebihan beban operator biner
Poin pertama pada §11.4.5 harus diubah sebagai berikut:
- Kumpulan operator yang didefinisikan oleh pengguna kandidat yang disediakan oleh
X
danY
untuk operasioperator op(x,y)
telah ditentukan. Set ini terdiri dari gabungan operator kandidat yang disediakan olehX
dan , kecuali jika operator tersebut adalah operator shift, operator kandidat yang disediakan olehY
, yang masing-masing ditentukan berdasarkan aturan Candidate user-defined operators §11.4.6. JikaX
danY
adalah jenis yang sama, atau jikaX
danY
berasal dari jenis dasar umum, operator kandidat bersama hanya terjadi dalam kumpulan gabungan sekali.
Artinya, untuk operator shift, operator kandidat hanyalah yang disediakan oleh jenis X
tersebut.
Kekurangan
Pengguna akan dapat menentukan operator yang tidak mengikuti panduan yang direkomendasikan, seperti menerapkan cout << "string"
di C#.
Alternatif
Antarmuka matematika generik yang diekspos oleh pustaka dapat mengekspos metode bernama secara eksplisit sebagai gantinya. Ini dapat membuat kode lebih sulit dibaca/dipertahankan.
Antarmuka matematika generik dapat mengharuskan pergeseran harus mengambil int
dan mengharuskan dilakukan konversi.
Konversi ini mungkin mahal atau mungkin tidak tergantung pada jenis yang dimaksud.
Pertanyaan yang belum terselesaikan
Apakah ada kekhawatiran tentang mempertahankan "niat" terkait alasan mengapa operand kedua dibatasi untuk int
?
Rapat desain
https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md
C# feature specifications