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.
Pengkompilasi C# menghasilkan kesalahan dan peringatan saat Anda menyalahgunakan jenis rekaman. Jenis catatan menyediakan anggota bawaan yang menerapkan kesetaraan berbasis nilai. Diagnostik ini membantu Anda mengikuti aturan untuk mendeklarasikan dan menggunakan jenis rekaman.
- CS8851: 'type' mendefinisikan 'Equals' tetapi bukan 'GetHashCode'
-
CS8857: Penerima
withekspresi harus memiliki tipe non-kosong. - CS8858: Jenis penerima 'type' bukan tipe rekaman yang valid dan bukan jenis struct.
- CS8859: Anggota bernama 'Clone' tidak diizinkan dalam record.
- CS8860: Jenis dan alias tidak boleh diberi nama 'rekaman'.
- CS8864: Rekaman hanya dapat diwarisi dari objek atau rekaman lain.
- CS8865: Hanya rekaman yang dapat diwarisi dari rekaman.
- CS8866: Anggota rekaman 'anggota' harus merupakan properti instans yang dapat dibaca atau bidang jenis 'jenis' untuk mencocokkan parameter posisi 'parameter'.
- CS8869: 'anggota' tidak mengambil alih metode yang diharapkan dari 'objek'.
- CS8870: 'member' tidak dapat disegel karena rekaman yang memuatnya tidak disegel.
- CS8871: 'member' tidak mengambil alih metode yang diharapkan dari 'type'.
- CS8872: 'anggota' harus mengizinkan penimpaan karena rekaman yang berisi tidak disegel.
- CS8873: Anggota *record* 'member' harus bersifat publik.
- CS8874: Anggota rekaman 'anggota' harus mengembalikan 'jenis'.
- CS8875: Anggota rekor 'anggota' harus dilindungi.
- CS8876: 'member' tidak menggantikan properti yang diharapkan dari 'type'.
- CS8877: Anggota rekor 'member' tidak boleh statis.
- CS8879: Atribut rekor 'anggota' harus bersifat privat.
- CS8906: Perekaman properti kontrak kesetaraan 'anggota' harus memiliki pengakses get.
- CS8908: Jenis 'type' tidak dapat digunakan untuk kolom rekaman.
- CS8913: Anggota posisi 'anggota' yang ditemukan sesuai dengan parameter ini disembunyikan.
Selain itu, artikel ini membahas peringatan berikut:
- CS8907: Parameter 'name' belum dibaca. Apakah Anda lupa menggunakannya untuk menginisialisasi properti dengan nama itu?
Tanda tangan anggota yang disintesis
- CS8869: 'anggota' tidak mengambil alih metode yang diharapkan dari 'objek'.
- CS8870: 'member' tidak dapat tertutup karena rekaman yang berisi tidak tertutup.
- CS8871: 'member' tidak mengambil alih metode yang diharapkan dari 'type'.
- CS8872: 'anggota' harus mengizinkan penimpaan karena rekaman yang berisi tidak disegel.
- CS8873: Anggota rekaman 'anggota' harus bersifat publik.
- CS8874: Anggota record 'member' harus mengembalikan 'tipe'.
- CS8875: Anggota rekaman 'anggota' harus dilindungi.
- CS8876: 'member' tidak menggantikan properti yang diantisipasi dari 'type'.
- CS8877: Anggota 'member' dalam rekaman mungkin tidak boleh berupa statis.
- CS8879: Anggota catatan 'anggota' harus bersifat privat.
- CS8906: Rekam properti kontrak kesetaraan 'anggota' harus memiliki aksesor get.
Ketika Anda secara eksplisit menyatakan anggota bahwa kompilator akan mensintesis untuk jenis catatan, deklarasi Anda harus cocok dengan tanda tangan, aksesibilitas, dan pengubah yang diharapkan. Untuk aturan lengkapnya, lihat spesifikasi rekaman dalam spesifikasi bahasa C#.
Untuk memperbaiki kesalahan ini, terapkan perubahan berikut pada anggota rekaman yang dinyatakan secara eksplisit:
- Ubah aksesibilitas metode
Equals,GetHashCode,ToString, metode deconstruct, dan propertiEqualityContractatau operatorop_Equalityop_Inequalitymenjadipublic. Pengkompilasi mengharuskan anggota ini dapat diakses secara publik sehingga kesetaraan berbasis nilai berfungsi dengan benar di semua konteks panggilan (CS8873). - Ubah aksesibilitas metode dari
PrintMemberskeprotectedsaat Anda mendeklarasikannya di kelas record yang tidak disegel. Metode harusprotectedkarena rekaman turunan mengambil alihnya untuk menyertakan properti mereka sendiri dalam output yang diformat (CS8875). - Ubah aksesibilitas metode menjadi
PrintMembersprivatesaat Anda mendeklarasikannya di kelas rekaman yang disegel atau struktur rekaman. Karena tidak ada jenis turunan yang dapat ada, metode tidak perlu dapat diakses di luar jenis (CS8879). - Hapus pengubah
staticdari anggota sintesis yang dinyatakan secara eksplisit. Anggota yang disintesis beroperasi pada instance rekam tertentu untuk menerapkan perilaku seperti pembandingan kesetaraan, pemformatan, dan penyalinan, sehingga mereka harus menjadi anggota instans (CS8877). - Ubah jenis pengembalian anggota agar sesuai dengan jenis yang diharapkan pengkompilasi. Misalnya,
EqualityContractproperti harus mengembalikanSystem.Type, danEqualsmetode harus mengembalikanbool. Pengkompilasi bergantung pada jenis pengembalian yang tepat ini untuk menghasilkan kode yang benar untuk kesetaraan dan perilaku sintesis lainnya (CS8874). - Hapus pengubah
sealeddari anggota sintesis yang dinyatakan secara eksplisit dalam rekaman yang tidak disegel. Rekaman turunan harus dapat mengambil alih anggota ini untuk memberikan logika kesetaraan dan pemformatan berbasis nilai mereka sendiri (CS8870). - Deklarasikan secara eksplisit anggota yang disintesis sebagai
virtualatauoverridedalam rekaman yang tidak disegel. Pengompilasi mengharuskan anggota ini untuk mengizinkan pengesampingan sehingga rekaman turunan dalam hierarki warisan dapat menyesuaikan perilaku mereka (CS8872). - Pastikan bahwa anggota yang Anda deklarasikan secara eksplisit meng-override metode yang diharapkan dari
objectatau dari tipe rekaman dasar. Misalnya,Equalsmetode harus mengambil alihobject.Equals, danGetHashCodeharus mengambil alihobject.GetHashCode. Kompilator memeriksa bahwa anggota ini berpartisipasi dalam rantai penimpaan yang benar sehingga kesetaraan berbasis nilai dan perilaku sintesis lainnya bekerja dengan benar di seluruh hierarki jenis (CS8869, CS8871). - Pastikan properti Anda yang dideklarasikan secara eksplisit menggantikan properti rekaman
EqualityContractdasar. Pengkompilasi bergantung pada rantai penggantian untuk kontrak persamaan guna membedakan tipe rekaman pada waktu jalan dalam hierarki pewarisan (CS8876). - Tambahkan
getaksesor ke propertiEqualityContract. Pengkompilasi membaca kontrak kesetaraan pada waktu proses untuk menentukan apakah dua instans rekaman memiliki jenis yang sama, sehingga properti harus dapat dibaca (CS8906).
Anggota Posisional
- CS8866: Anggota rekaman 'anggota' harus merupakan properti instans yang dapat dibaca atau bidang jenis 'jenis' untuk mencocokkan parameter posisi 'parameter'.
- CS8907: Parameter 'name' belum dibaca. Apakah Anda lupa menggunakannya untuk menginisialisasi properti dengan nama itu?
- CS8908: Tipe 'type' tidak dapat digunakan untuk bidang rekor.
- CS8913: Anggota posisi 'member' yang ditemukan untuk parameter ini tidak terlihat.
Saat Anda mendeklarasikan rekaman posisi, pengkompilasi mensintesis properti yang sesuai dengan setiap parameter posisi. Diagnostik ini menunjukkan bahwa deklarasi eksplisit Anda bertentangan dengan properti yang disintesis tersebut. Untuk aturan lengkapnya, lihat spesifikasi rekaman dalam spesifikasi bahasa C#.
Untuk memperbaiki kesalahan ini, terapkan perubahan berikut pada deklarasi rekaman posisi Anda:
- Ubah anggota yang dideklarasikan secara eksplisit yang sesuai dengan parameter posisional sehingga merupakan properti atau bidang instans yang dapat dibaca dengan jenis yang sama dengan parameter . Kompilator membutuhkan anggota agar dapat dibaca dan kompatibel dengan jenis sehingga metode yang disintesis
Deconstructdan pencocokan pola posisi dapat mengakses nilai dengan benar (CS8866). - Pastikan bahwa setiap parameter posisi menginisialisasi properti yang sesuai dalam isi konstruktor saat Anda memberikan konstruktor eksplisit. Pengkompilasi menimbulkan peringatan ketika parameter tidak digunakan karena biasanya menunjukkan kesalahan ketik atau ketidakcocokan antara nama parameter dan nama properti, yang akan membuat properti tidak diinisialisasi (CS8907).
- Ubah tipe bidang yang dideklarasikan dalam rekaman menjadi tipe yang valid dalam konteks tersebut. Jenis tertentu, seperti
Span<T>atau jenis lainnyaref struct, tidak dapat digunakan sebagai bidang dalam rekaman karena tipe rekaman mengharuskan semua bidang kompatibel dengan alokasi timbunan dan kesetaraan berbasis nilai (CS8908). - Hapus pengubah
newdari anggota dalam rekaman turunan yang menyembunyikan anggota posisi pada rekaman dasar. Ketika anggota berposisi tersembunyi, pengompilasi tidak dapat mencocokkan parameter berposisi dengan properti yang sesuai, yang mengganggu metode yang disintesis dan pencocokan pola berposisi (Deconstruct).
Anggota kesetaraan
- CS8851: 'type' mendefinisikan 'Equals' tetapi bukan 'GetHashCode'
-
CS8857: Penerima ekspresi
withharus memiliki tipe yang tidak kosong. - CS8858: Tipe penerima 'type' bukan tipe record yang valid dan bukan tipe struct.
Jenis catatan menyediakan kesetaraan berbasis nilai bawaan. Diagnostik ini muncul ketika deklarasi Anda bertentangan dengan kontrak kesetaraan. Untuk aturan lengkap tentang kesetaraan, lihat perbandingan kesetaraan.
Untuk memperbaiki kesalahan ini, terapkan perubahan berikut:
- Tambahkan metode
GetHashCodesetiap kali Anda menetapkan metodeEquals. Kontrak kesetaraan mengharuskan objek yang dianggap sama menghasilkan kode hash yang sama, sehingga kompilator memberlakukan bahwa kedua metode ini selalu didefinisikan bersama-sama (CS8851). - Ubah penerima
withekspresi sehingga merupakan tipe rekaman atau tipe struct. Ekspresiwithmembuat salinan yang dimodifikasi dengan menggunakanrecordkonstruktor salinan, atau semantik salinan nilai untuk jenisstruct(CS8858). - Pastikan penerima
withekspresi memiliki tipe non-void. Ekspresiwithmenghasilkan salinan penerima baru, sehingga penerima harus mengevaluasi ke nilai yang dapat disalin (CS8857).
Pewarisan rekaman
- CS8864: Rekaman hanya dapat diwarisi dari objek atau rekaman lain
- CS8865: Hanya rekaman yang dapat diwarisi dari rekaman.
Jenis kelas rekaman mengikuti aturan pewarisan tertentu. Untuk aturan lengkapnya, lihat spesifikasi rekaman dalam spesifikasi bahasa C#.
Untuk memperbaiki kesalahan ini, terapkan perubahan berikut:
- Ubah jenis dasar kelas rekaman sehingga mewarisi dari
objectatau dari kelas rekaman lain. Jenis rekaman mengandalkan anggota yang disintesis oleh kompilator untuk kesetaraan dan penyalinan yang hanya kompatibel dengan jenis rekaman lain, sehingga kompilator tidak mengizinkan tipe rekaman untuk mewarisi dari kelas non-rekaman (CS8864). - Ubah kelas non-record yang mewarisi dari kelas record agar dinyatakan sebagai kelas record. Karena jenis rekaman mensintesis kesetaraan, kloning, dan anggota lain yang bergantung pada rantai warisan yang konsisten, pengkompilasi memerlukan setiap jenis dalam hierarki untuk menjadi kelas rekaman (CS8865). Jenis struct rekaman tidak dapat berpartisipasi dalam hierarki pewarisan selain penerapan antarmuka.
Nama anggota yang dicadangkan
- CS8859: Anggota bernama 'Clone' tidak diizinkan dalam rekor.
- CS8860: Jenis dan alias tidak boleh diberi nama 'rekaman'.
Pengkompilasi mencadangkan nama tertentu untuk digunakan dengan jenis catatan. Untuk aturan lengkapnya, lihat spesifikasi rekaman dalam spesifikasi bahasa C#.
Untuk memperbaiki kesalahan ini, terapkan perubahan berikut:
- Ganti nama anggota yang dipanggil
Clonedalam jenis catatan menjadi nama yang berbeda. Kompilator secara internal menggunakanCloneuntuk mengimplementasikan semantik salin padawithekspresi, sehingga deklarasi anggotaCloneAnda sendiri bertentangan dengan implementasi yang disintesis (CS8859). - Ganti nama jenis atau alias apa pun yang dinamai
recorddengan nama yang berbeda. Karenarecordadalah kata kunci kontekstual yang digunakan untuk mendeklarasikan jenis rekaman, penamaan jenis atau aliasrecordmenciptakan ambiguitas yang dapat membingungkan kompilator dan pengembang yang membaca kode (CS8860).