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.
Artikel ini membahas kesalahan pengkompilasi berikut:
- CS0071: Implementasi antarmuka eksplisit dari suatu peristiwa harus menggunakan sintaks aksesor peristiwa.
- CS0106: Pengubah tidak valid untuk item ini.
- CS0277: Anggota tidak menerapkan elemen antarmuka karena tidak bersifat publik.
- CS0425: Batasan untuk parameter jenis metode harus cocok dengan batasan untuk parameter jenis metode antarmuka. Pertimbangkan untuk menggunakan implementasi antarmuka eksplisit sebagai gantinya.
- CS0460: Batasan untuk mengambil alih dan metode implementasi antarmuka eksplisit diwariskan dari metode dasar, sehingga tidak dapat ditentukan secara langsung, kecuali untuk batasan 'kelas', atau 'struct'.
- CS0470: Metode tidak dapat menerapkan aksesor antarmuka untuk jenis. Gunakan implementasi antarmuka eksplisit.
- CS0473: Implementasi antarmuka eksplisit 'nama metode' cocok dengan lebih dari satu anggota antarmuka. Anggota antarmuka mana yang sebenarnya dipilih bergantung pada implementasi. Pertimbangkan untuk menggunakan implementasi non-eksplisit sebagai gantinya.
- CS0531: Anggota antarmuka tidak dapat memiliki definisi.
- CS0535: Anggota tidak menerapkan elemen antarmuka.
- CS0538: Anggota dalam deklarasi antarmuka eksplisit bukanlah antarmuka.
- CS0539: Anggota dalam deklarasi antarmuka eksplisit tidak ditemukan di antara anggota antarmuka yang dapat diimplementasikan.
- CS0540: Tipe yang mengandung tidak mengimplementasikan anggota antarmuka.
- CS0541: Deklarasi antarmuka eksplisit hanya dapat dideklarasikan dalam kelas, rekaman, struktur, atau antarmuka.
- CS0550: Anggota menambahkan aksesor yang tidak ditemukan di anggota antarmuka.
- CS0551: Implementasi antarmuka eksplisit kehilangan aksesor.
- CS0630: Anggota tidak dapat menerapkan anggota antarmuka karena memiliki parameter __arglist.
- CS0686: Aksesor tidak dapat menerapkan anggota antarmuka. Gunakan implementasi antarmuka eksplisit.
- CS0736: Anggota tidak menerapkan anggota instans antarmuka. Anggota tersebut tidak dapat mengimplementasikan anggota antarmuka karena statis.
- CS0737: Elemen tidak menerapkan anggota antarmuka. Elemen ini tidak dapat menerapkan anggota antarmuka karena tidak bersifat publik.
- CS0738: Anggota tidak menerapkan anggota antarmuka. Hal ini tidak dapat dilakukan karena tidak memiliki tipe pengembalian yang sesuai.
- CS8705: Anggota antarmuka tidak memiliki implementasi yang paling spesifik. Tidak ada anggota yang paling spesifik.
- CS8854: Anggota tidak mengimplementasikan anggota antarmuka.
- CS9333: Jenis parameter harus cocok dengan anggota yang diimplementasikan.
- CS9334: Tipe pengembalian harus cocok dengan anggota yang diimplementasikan.
Deklarasi dan sintaks antarmuka
Kesalahan berikut berkaitan dengan sintaks dan struktur yang tepat saat mendeklarasikan implementasi antarmuka eksplisit:
- CS0071: Implementasi antarmuka eksplisit dari suatu peristiwa harus menggunakan sintaks aksesor peristiwa.
- CS0106: Pengubah tidak valid untuk item ini.
- CS0531: Anggota antarmuka tidak dapat memiliki definisi.
- CS0538: Anggota dalam deklarasi antarmuka eksplisit bukanlah antarmuka.
- CS0541: Deklarasi antarmuka eksplisit hanya dapat dideklarasikan dalam kelas, rekaman, struktur, atau antarmuka.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Anda harus menyediakan
adddanremovepengakses peristiwa secara manual saat secara eksplisit menerapkan peristiwa antarmuka (CS0071). Pengkompilasi tidak secara otomatis menghasilkan aksesor ini untuk implementasi antarmuka eksplisit, jadi Anda harus menentukannya secara eksplisit untuk menentukan bagaimana peristiwa disimpan dan dikelola. - Hapus pengubah
publicdari implementasi antarmuka eksplisit (CS0106). Implementasi antarmuka eksplisit secara implisit bersifat publik ketika diakses melalui jenis antarmuka, membuatpublickata kunci berlebihan dan tidak diizinkan dalam konteks ini. - Hapus pengubah
abstractdari implementasi antarmuka eksplisit (CS0106). Implementasi antarmuka eksplisit menyediakan implementasi aktual dan tidak dapat ditandai sebagai abstrak karena tidak dapat ditimpa di kelas turunan. - Hapus isi metode dari deklarasi anggota antarmuka, atau pindahkan implementasi ke kelas atau struktur yang mengimplementasikan antarmuka (CS0531). Sebelum C# 8.0, anggota antarmuka tidak dapat berisi implementasi; dimulai dengan C# 8.0, Anda dapat menyediakan metode antarmuka default menggunakan sintaks tertentu.
- Verifikasi bahwa jenis yang ditentukan dalam deklarasi antarmuka eksplisit adalah jenis antarmuka aktual (CS0538). Hanya jenis antarmuka yang dapat digunakan dalam sintaks implementasi antarmuka eksplisit; mencoba menggunakan kelas atau jenis non-antarmuka lainnya melanggar aturan implementasi eksplisit.
- Pindahkan deklarasi antarmuka eksplisit ke dalam kelas atau struktur yang mendeklarasikan antarmuka dalam daftar dasarnya (CS0541). Implementasi antarmuka eksplisit harus muncul dalam isi kelas atau jenis struktur dan tidak dapat dideklarasikan pada tingkat namespace layanan atau dalam konteks lain.
Untuk informasi selengkapnya, lihat Antarmuka, Implementasi Antarmuka Eksplisit, dan Cara mengimplementasikan peristiwa antarmuka.
Mengembalikan jenis dan tanda tangan
Kesalahan berikut terjadi ketika tanda tangan metode penerapan tidak cocok dengan deklarasi anggota antarmuka:
- CS0738: Anggota tidak mengimplementasikan anggota antarmuka. Hal ini tidak dapat dilakukan karena tipe pengembalian tidak cocok.
- CS8854: Anggota tidak menerapkan anggota antarmuka.
- CS9333: Jenis parameter harus cocok dengan anggota yang diimplementasikan.
- CS9334: Jenis pengembalian harus cocok dengan anggota yang diimplementasi.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Ubah jenis pengembalian metode penerapan agar sama persis dengan jenis pengembalian yang dideklarasikan dalam anggota antarmuka (CS0738, CS9334). Tanda tangan implementasi harus cocok dengan deklarasi antarmuka dengan tepat karena tanda tangan metode adalah bagian dari kontrak yang menentukan anggota antarmuka mana yang sedang diimplementasikan.
- Pastikan bahwa jenis parameter dalam metode penerapan sama persis dengan jenis parameter yang dideklarasikan dalam anggota antarmuka (CS9333). Setiap parameter harus memiliki jenis yang identik dalam posisi yang sama seperti yang ditentukan dalam deklarasi antarmuka, karena jenis parameter adalah komponen mendasar dari tanda tangan metode yang digunakan pengkompilasi untuk mencocokkan implementasi dengan anggota antarmuka.
- Tambahkan
initpengakses ke properti yang diimplementasikan ketika properti antarmuka mendeklarasikaninitsetter (CS8854). Katainitkunci memungkinkan inisialisasi properti selama konstruksi objek sambil mencegah modifikasi setelahnya, dan properti penerapan harus memberikan perilaku khusus inisialisasi yang sama ini untuk memenuhi kontrak antarmuka.
Untuk informasi selengkapnya, lihat Antarmuka, Properti, dan pengatur Init-only.
Implementasi yang hilang atau tidak lengkap
Kesalahan berikut terjadi ketika kelas gagal mengimplementasikan antarmuka sepenuhnya atau mengimplementasikan anggota yang tidak cocok dengan kontrak antarmuka:
- CS0535: Anggota tidak menerapkan anggota antarmuka.
- CS0550: Anggota menambahkan aksesor yang tidak ditemukan di anggota antarmuka.
- CS0551: Implementasi antarmuka eksplisit tidak memiliki pengakses.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Berikan implementasi untuk setiap anggota yang dideklarasikan dalam antarmuka, atau nyatakan jenis sebagai
abstract(CS0535). Setiap anggota harus diimplementasikan untuk memenuhi persyaratan antarmuka. - Hapus aksesor apa pun dari properti penerapan yang tidak dideklarasikan dalam properti antarmuka (CS0550). Properti pelaksana hanya dapat memuat pengakses yang secara eksplisit dideklarasikan dalam definisi antarmuka, agar implementasinya tidak menambahkan fungsionalitas melebihi yang ditetapkan oleh kontrak antarmuka.
- Tambahkan semua aksesor yang diperlukan ke implementasi antarmuka eksplisit agar sesuai dengan deklarasi antarmuka (CS0551). Setiap aksesor yang dideklarasikan dalam antarmuka harus memiliki aksesor yang sesuai dalam implementasi dengan tanda tangan yang cocok, karena implementasi harus memenuhi kontrak aksesor lengkap yang ditentukan oleh antarmuka.
Untuk informasi selengkapnya, lihat Antarmuka dan Properti.
Pencocokan anggota dan resolusi
Kesalahan berikut terjadi saat mencoba menerapkan anggota antarmuka yang tidak ada di antarmuka atau ketika jenis yang berisi tidak mendeklarasikan antarmuka:
- CS0539: Anggota dalam deklarasi antarmuka eksplisit tidak ditemukan di antara anggota antarmuka yang dapat diimplementasikan.
- CS0540: Tipe yang mengandung tidak mengimplementasikan anggota antarmuka.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Verifikasi bahwa nama anggota dan tanda tangan dalam implementasi antarmuka eksplisit sama persis dengan anggota yang dideklarasikan dalam antarmuka, atau hapus implementasi yang salah (CS0539). Anggota yang Anda coba terapkan harus benar-benar ada dalam definisi antarmuka dengan nama yang cocok, jenis pengembalian, dan jenis parameter, karena implementasi antarmuka eksplisit memerlukan korespondensi yang tepat dengan kontrak antarmuka.
- Tambahkan antarmuka ke daftar dasar kelas atau struktur, atau hapus implementasi antarmuka eksplisit (CS0540). Jenis hanya dapat secara eksplisit mengimplementasikan anggota antarmuka yang dinyatakannya dalam daftar warisannya, sehingga jenis penerapan harus membangun hubungan antarmuka sebelum dapat memberikan implementasi eksplisit.
Untuk informasi selengkapnya, lihat Antarmuka dan Implementasi Antarmuka Eksplisit.
Batasan jenis generik
Kesalahan berikut terjadi saat menerapkan metode antarmuka generik dengan batasan parameter jenis:
- CS0425: Batasan untuk parameter jenis metode harus cocok dengan batasan untuk parameter jenis metode antarmuka. Pertimbangkan untuk menggunakan implementasi antarmuka eksplisit sebagai gantinya.
- CS0460: Batasan untuk override dan metode implementasi antarmuka eksplisit diturunkan dari metode dasar, sehingga tidak dapat ditentukan secara langsung, kecuali untuk batasan 'class' atau 'struct'.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
-
wherePastikan klausul dalam metode penerapan identik dengan deklarasi metode antarmuka, atau cocok dengan arti semantik dari batasan (CS0425). Batasan parameter jenis dalam implementasi harus cocok dengan yang ditentukan dalam antarmuka atau metode dasar. - Hapus deklarasi batasan eksplisit dari metode override dan metode implementasi antarmuka eksplisit (CS0460). Metode override mewarisi batasannya secara otomatis dari metode dasar atau antarmuka, sehingga mendeklarasikannya dianggap berlebihan dan tidak diizinkan kecuali untuk kasus pengecualian tertentu yang diizinkan di C# 8 dan versi yang lebih baru.
-
defaultTerapkan batasan untuk mengatasi ambiguitas dengan jenis referensi nullable dalam mengambil alih dan implementasi antarmuka eksplisit saat menggunakan C# 9 atau yang lebih baru (CS0460). Pengecualian untuk aturan pewarisan batasan ini memungkinkan Anda untuk secara eksplisit menentukan batasan default untuk memisahkan konteks anotasi nullable. - Tentukan batasan
where T : classatauwhere T : structsecara eksplisit pada metode penggantian dan implementasi antarmuka eksplisit saat menggunakan C# 8 atau yang lebih baru untuk mengaktifkan anotasi tipe referensi nullable (CS0460). Pembatasan spesifik ini diizinkan untuk mendukung analisis tipe referensi yang dapat bernilai null pada parameter tipe yang dibatasi pada tipe referensi atau tipe nilai.
Untuk informasi selengkapnya, lihat Batasan pada parameter jenis, Antarmuka, dan jenis referensi nullable.
Visibilitas dan pengubah metode
Kesalahan berikut terjadi saat menerapkan metode antarmuka dengan aksesibilitas atau pengubah yang salah:
- CS0736: Anggota tidak menerapkan anggota antarmuka instance. Ini tidak dapat menerapkan anggota antarmuka karena bersifat statis.
- CS0737: Anggota tidak menerapkan anggota antarmuka. Anggota ini tidak dapat menerapkan anggota antarmuka karena bukan publik.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Hapus pengubah
staticdari deklarasi metode yang mengimplementasikan anggota antarmuka (CS0736). Sebelum C# 10, anggota antarmuka adalah anggota instans, bukan anggota statis. - Tambahkan
publicpengubah akses ke metode yang mengimplementasikan anggota antarmuka (CS0737). Semua anggota antarmuka adalahpublicsecara implisit karena antarmuka menentukan sebuah kontrak terhadap perilaku publik, sehingga metode yang menerapkan juga harus memiliki aksesibilitas publik untuk dapat diakses melalui referensi dari antarmuka.
Untuk informasi selengkapnya, lihat Antarmuka dan Pengubah Akses.
Implementasi aksesori dan konflik
Kesalahan berikut terjadi saat menerapkan properti antarmuka atau event dengan metode pengakses yang memiliki masalah visibilitas atau konflik penamaan:
- CS0277: Anggota tidak menerapkan anggota antarmuka karena tidak bersifat publik.
- CS0470: Metode tidak dapat menerapkan aksesor antarmuka untuk jenis. Gunakan implementasi antarmuka eksplisit.
- CS0686: Aksesor tidak dapat menerapkan anggota antarmuka. Gunakan implementasi antarmuka eksplisit.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Hapus pengubah akses apa pun dari aksesor properti yang membatasi visibilitas lebih terbatas daripada
public, atau tambahkan pengubahpublicjika pengubah tersebut hilang (CS0277). Semua anggota antarmuka bersifatpublicimplisit, sehingga pengakses yang menerapkan juga harus memiliki aksesibilitas publik untuk memenuhi kontrak antarmuka dan dapat diakses melalui tipe antarmuka. - Ganti metode dengan nama seperti aksesor (seperti
get_PropertyName) dengan sintaks properti yang tepat menggunakan implementasi antarmuka eksplisit (CS0470). Kompilator secara internal menghasilkan metode aksesor untuk properti, dan upaya untuk membuat metode secara manual dengan nama-nama yang sudah dipesan ini akan bertentangan dengan mekanisme implementasi properti. - Gunakan sintaks implementasi antarmuka eksplisit untuk mengatasi konflik penamaan saat antarmuka berisi nama metode yang cocok dengan metode aksesor yang dihasilkan secara otomatis (CS0686). Pengkompilasi secara otomatis menghasilkan metode seperti
get_Propertydanset_Propertyuntuk properti, dan danadd_Eventremove_Eventuntuk peristiwa, jadi jika antarmuka mendeklarasikan metode dengan nama yang tepat ini, implementasi eksplisit diperlukan untuk membedakan antara metode antarmuka dan aksesor yang dihasilkan kompilator.
Untuk informasi selengkapnya, lihat Antarmuka, Properti, dan Peristiwa.
Implementasi yang ambigu dan bertentangan
Kesalahan berikut terjadi ketika pengkompilasi tidak dapat menentukan implementasi antarmuka mana yang akan digunakan:
- CS0473: Implementasi antarmuka eksplisit 'nama metode' cocok dengan lebih dari satu anggota antarmuka. Anggota antarmuka mana yang sebenarnya dipilih bergantung pada implementasi. Pertimbangkan untuk menggunakan implementasi non-eksplisit sebagai gantinya.
- CS8705: Anggota antarmuka 'member' tidak memiliki implementasi yang paling spesifik. Tidak satupun yang paling spesifik.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
- Hilangkan implementasi antarmuka eksplisit dan sebagai gantinya gunakan satu implementasi publik implisit untuk kedua metode antarmuka (CS0473). Ketika metode generik memperoleh tanda tangan yang sama dengan metode non-generik (seperti saat menerapkan
ITest<int>di mana keduanyaTestMethod(int)danTestMethod(T)menjadi identik), sistem metadata infrastruktur bahasa umum tidak dapat secara tidak ambigu menentukan anggota antarmuka mana yang mengikat slot implementasi mana, jadi menggunakan implementasi implisit memungkinkan metode tunggal untuk memenuhi kedua persyaratan antarmuka. - Berikan implementasi eksplisit di kelas penerapan atau struktur yang menyelesaikan ambiguitas antara beberapa implementasi default (CS8705). Kesalahan ini biasanya terjadi dengan pola pewarisan berlian di mana kelas mengimplementasikan beberapa antarmuka yang masing-masing menyediakan implementasi default untuk anggota yang sama. Pengkompilasi membutuhkan Anda untuk secara eksplisit menentukan implementasi mana yang akan digunakan, atau memberikan implementasi Anda sendiri.
- Restrukturisasi hierarki antarmuka untuk menghindari konflik warisan berlian di mana beberapa antarmuka menyediakan implementasi default untuk anggota yang sama (CS8705). Dengan mendesain ulang hubungan antarmuka atau mengonsolidasikan implementasi default ke dalam satu antarmuka, Anda dapat menghilangkan ambiguitas yang mencegah pengkompilasi menentukan implementasi yang paling spesifik.
Untuk informasi selengkapnya, lihat Antarmuka dan Metode Antarmuka Default.
Pembatasan implementasi khusus
Kesalahan berikut terjadi saat menggunakan jenis parameter khusus yang tidak kompatibel dengan implementasi antarmuka:
- CS0630: Anggota tidak dapat menerapkan anggota antarmuka karena memiliki parameter __arglist.
Anda dapat memperbaiki kesalahan ini menggunakan teknik berikut:
-
__arglistHapus parameter dari metode penerapan (CS0630). Kata__arglistkunci memungkinkan metode untuk menerima jumlah variabel argumen dengan cara yang tidak terkelola, tetapi fitur ini tidak kompatibel dengan implementasi antarmuka karena kontrak antarmuka memerlukan tanda tangan yang dapat diprediksi dan aman yang dapat diverifikasi pada waktu kompilasi. - Ganti parameter
__arglistdengan parameter arrayparamsuntuk daftar argumen dengan panjang variabel (CS0630). Tidak seperti__arglist, kata kunciparamsmenyediakan mekanisme type-safe untuk menerima jumlah argumen yang bervariasi yang sepenuhnya kompatibel dengan implementasi antarmuka dan mempertahankan keamanan tipe waktu kompilasi yang diperlukan oleh antarmuka.
Untuk informasi selengkapnya, lihat Kata kunci Antarmuka dan param.