Bagikan melalui


Pelonggaran persyaratan operator shift

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 dan Y untuk operasi operator op(x,y) telah ditentukan. Set ini terdiri dari gabungan operator kandidat yang disediakan oleh X dan , kecuali jika operator tersebut adalah operator shift, operator kandidat yang disediakan oleh Y, yang masing-masing ditentukan berdasarkan aturan Candidate user-defined operators §11.4.6. Jika X dan Y adalah jenis yang sama, atau jika X dan Y 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 Xtersebut.

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