Mengatasi kesalahan dan peringatan untuk deklarasi rekaman

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 with ekspresi 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 properti EqualityContract atau operator op_Equalityop_Inequality menjadi public. Pengkompilasi mengharuskan anggota ini dapat diakses secara publik sehingga kesetaraan berbasis nilai berfungsi dengan benar di semua konteks panggilan (CS8873).
  • Ubah aksesibilitas metode dari PrintMembers ke protected saat Anda mendeklarasikannya di kelas record yang tidak disegel. Metode harus protected karena rekaman turunan mengambil alihnya untuk menyertakan properti mereka sendiri dalam output yang diformat (CS8875).
  • Ubah aksesibilitas metode menjadi PrintMembersprivate saat 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 static dari 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, EqualityContract properti harus mengembalikan System.Type, dan Equals metode harus mengembalikan bool. Pengkompilasi bergantung pada jenis pengembalian yang tepat ini untuk menghasilkan kode yang benar untuk kesetaraan dan perilaku sintesis lainnya (CS8874).
  • Hapus pengubah sealed dari 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 virtual atau override dalam 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 object atau dari tipe rekaman dasar. Misalnya, Equals metode harus mengambil alih object.Equals, dan GetHashCode harus mengambil alih object.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 EqualityContract dasar. Pengkompilasi bergantung pada rantai penggantian untuk kontrak persamaan guna membedakan tipe rekaman pada waktu jalan dalam hierarki pewarisan (CS8876).
  • Tambahkan get aksesor ke properti EqualityContract. 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 Deconstruct dan 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 lainnya ref 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 new dari 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 with harus 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 GetHashCode setiap kali Anda menetapkan metode Equals. 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 with ekspresi sehingga merupakan tipe rekaman atau tipe struct. Ekspresi with membuat salinan yang dimodifikasi dengan menggunakan record konstruktor salinan, atau semantik salinan nilai untuk jenis struct (CS8858).
  • Pastikan penerima with ekspresi memiliki tipe non-void. Ekspresi with menghasilkan 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 object atau 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 Clone dalam jenis catatan menjadi nama yang berbeda. Kompilator secara internal menggunakan Clone untuk mengimplementasikan semantik salin pada with ekspresi, sehingga deklarasi anggota Clone Anda sendiri bertentangan dengan implementasi yang disintesis (CS8859).
  • Ganti nama jenis atau alias apa pun yang dinamai record dengan nama yang berbeda. Karena record adalah kata kunci kontekstual yang digunakan untuk mendeklarasikan jenis rekaman, penamaan jenis atau alias record menciptakan ambiguitas yang dapat membingungkan kompilator dan pengembang yang membaca kode (CS8860).