Bagikan melalui


Kesalahan dan peringatan anggota abstrak dan antarmuka virtual statis

Kompiler menghasilkan kesalahan berikut untuk deklarasi abstrak statis atau anggota virtual yang tidak valid dalam antarmuka:

  • CS8920: Antarmuka tidak dapat digunakan sebagai argumen jenis. Anggota statis tidak memiliki implementasi yang paling spesifik dalam antarmuka.
  • CS8921: Parameter operator unary harus berupa tipe yang mengandung, atau parameter tipenya yang dibatasi sesuai itu.
  • CS8922: Jenis parameter untuk ++ atau -- operator harus berupa jenis yang berisi, atau parameter jenisnya yang dibatasi untuk itu.
  • CS8923: Jenis pengembalian untuk ++ atau -- operator harus cocok dengan jenis parameter, atau berasal dari jenis parameter, atau menjadi parameter jenis tipe yang dibatasi untuk itu, kecuali jenis parameter adalah parameter tipe yang berbeda.
  • CS8924: Salah satu parameter operator biner harus berupa jenis yang berisi, atau parameter jenisnya yang dibatasi untuk itu.
  • CS8925: Operand pertama dari operator shift yang dilebani harus memiliki tipe yang sama dengan tipe yang mencakup atau parameter tipe yang dibatasi padanya
  • CS8926: Anggota antarmuka virtual atau abstrak statis hanya dapat diakses pada parameter jenis.
  • CS8928: Jenis tidak menerapkan anggota antarmuka statis. Metode tidak dapat mengimplementasikan anggota antarmuka karena tidak statis.
  • CS8930: Implementasi eksplisit operator yang ditentukan pengguna harus dinyatakan statis
  • CS8931: Konversi yang ditentukan pengguna dalam antarmuka harus dikonversi ke atau dari parameter jenis pada jenis penutup yang dibatasi ke jenis penutup
  • CS8932: Metode 'UnmanagedCallersOnly' tidak dapat menerapkan anggota antarmuka dalam jenis
  • CS9044: Jenis tidak menerapkan anggota antarmuka. Metode tidak dapat secara implisit mengimplementasikan anggota yang tidak dapat diakses.
  • CS9046: Salah satu parameter operator kesetaraan atau ketidaksetaraan yang dideklarasikan dalam antarmuka harus berupa parameter jenis yang dibatasi pada antarmuka

Kesalahan ini terjadi di tiga tempat dalam kode Anda:

Kesalahan dalam deklarasi antarmuka

Anda mungkin mengalami kesalahan berikut saat mendeklarasikan antarmuka dengan static abstract atau static virtual anggota:

  • CS8921: Parameter operator unari harus berupa jenis yang mengandungnya, atau parameter jenisnya yang dibatasi padanya.
  • CS8922: Jenis parameter untuk operator ++ atau -- harus berupa tipe yang mengandung, atau parameter tipenya dibatasi oleh tipe tersebut.
  • CS8923: Tipe pengembalian untuk operator ++ atau -- harus cocok dengan tipe parameter, atau berasal dari tipe parameter, atau menjadi parameter tipe dari tipe yang berisi yang tunduk pada batasan kecuali tipe parameter adalah parameter tipe yang berbeda.
  • CS8924: Salah satu parameter operator biner harus berupa jenis yang berisi, atau parameter jenisnya yang dibatasi untuk itu.
  • CS8925: Operand pertama operator shift yang di-overload harus memiliki tipe yang sama dengan tipe yang memuat atau parameter tipenya yang dibatasi pada tipe tersebut
  • CS8931: Konversi yang ditentukan oleh pengguna dalam antarmuka harus mengonversi ke atau dari parameter tipe pada tipe pembungkus yang dibatasi ke tipe pembungkus tersebut
  • CS9046: Salah satu parameter operator kesetaraan atau ketidaksetaraan yang dinyatakan dalam antarmuka harus merupakan parameter jenis yang dibatasi pada antarmuka

Untuk operator unary yang dideklarasikan dalam antarmuka, pastikan parameter adalah jenis antarmuka itu sendiri atau parameter T jenis di mana T dibatasi untuk mengimplementasikan antarmuka (CS8921). Batasan ini memastikan operator hanya dapat diterapkan pada jenis yang mengimplementasikan antarmuka, memungkinkan pengkompilasi untuk menyelesaikan implementasi yang benar pada waktu kompilasi.

Untuk operator kenaikan (++) dan penurunan (--), verifikasi bahwa parameter mengikuti aturan yang sama dengan operator unary lainnya (CS8922). Selain itu, jenis pengembalian harus cocok dengan jenis parameter, berasal darinya, atau menjadi parameter jenis dari antarmuka yang dibatasi pada antarmuka (CS8923). Aturan ini memastikan bahwa operasi kenaikan dan penurunan mengembalikan jenis yang kompatibel yang dapat ditetapkan kembali ke variabel asli.

Untuk operator biner, setidaknya salah satu dari dua parameter harus berisi jenis antarmuka atau parameter jenis yang dibatasi untuk mengimplementasikan antarmuka (CS8924). Persyaratan ini memungkinkan parameter lain untuk menjadi jenis apa pun, memungkinkan operator seperti T operator +(T left, int right) dalam skenario matematika generik.

Untuk operator shift (<< dan >>), operand pertama harus berupa jenis yang berisi atau parameter jenis yang dibatasi (CS8925). Operand kedua mengikuti aturan operator shift standar dan biasanya int.

Untuk operator konversi yang ditentukan pengguna, konversi harus melibatkan parameter jenis yang dibatasi ke jenis antarmuka penutup (CS8931). Anda tidak dapat menentukan konversi antara jenis arbitrer dalam antarmuka; konversi harus terkait dengan jenis yang mengimplementasikan antarmuka.

Untuk operator kesetaraan (==) dan ketidaksetaraan (!=), setidaknya satu parameter harus berupa parameter jenis yang dibatasi pada antarmuka, bukan hanya jenis antarmuka itu sendiri (CS9046). Persyaratan yang lebih ketat untuk operator kesetaraan ini memastikan keamanan tipe yang tepat saat membandingkan instance melalui antarmuka.

Untuk informasi selengkapnya tentang aturan untuk deklarasi operator di antarmuka, lihat anggota abstrak statis dalam antarmuka. Untuk panduan praktis untuk menerapkan pola-pola ini, lihat Menjelajahi anggota antarmuka abstrak statis.

Kesalahan dalam tipe yang mengimplementasikan deklarasi antarmuka

Anda mungkin mengalami kesalahan berikut saat menentukan jenis yang mengimplementasikan antarmuka dengan static abstract metode atau static virtual :

  • CS8928: Jenis tidak menerapkan anggota antarmuka statis. Metode tidak dapat mengimplementasikan anggota antarmuka karena tidak statis.
  • CS8930: Implementasi eksplisit operator yang ditentukan pengguna harus dinyatakan statis
  • CS8932: Metode 'UnmanagedCallersOnly' tidak dapat menerapkan anggota antarmuka pada tipe
  • CS9044: Jenis tidak menerapkan anggota antarmuka. Metode tidak dapat secara implisit mengimplementasikan anggota yang tidak dapat diakses.

Saat Anda menerapkan anggota antarmuka virtual abstrak statis atau statis, nyatakan metode penerapan dengan menggunakan static pengubah (CS8928). Tidak seperti anggota antarmuka instans yang diimplementasikan oleh metode instans, anggota abstrak statis memerlukan implementasi statis karena runtime memanggilnya pada jenis itu sendiri, bukan pada instans.

Untuk implementasi eksplisit operator yang ditentukan pengguna dari antarmuka, sertakan static pengubah dalam implementasi (CS8930). Implementasi antarmuka eksplisit operator mengikuti persyaratan statis yang sama dengan implementasi implisit.

System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute Hapus atribut dari metode apa pun yang mengimplementasikan anggota antarmuka (CS8932). Metode yang ditandai dengan menggunakan atribut ini hanya dapat dipanggil dari kode yang tidak dikelola dan tidak dapat berpartisipasi dalam implementasi antarmuka karena runtime perlu memanggilnya melalui mekanisme pengiriman antarmuka.

Jika metode penerapan memiliki aksesibilitas yang lebih terbatas daripada anggota dari antarmuka (misalnya, metode private atau internal menerapkan anggota dari antarmuka public), gunakan sintaks implementasi antarmuka eksplisit alih-alih implementasi implisit (CS9044). Implementasi implisit mengharuskan anggota yang menerapkan memiliki tingkat aksesibilitas setidaknya sama dengan anggota antarmuka yang diterapkannya.

Untuk informasi selengkapnya tentang menerapkan anggota antarmuka, lihat Antarmuka dan implementasi antarmuka eksplisit.

Kesalahan saat memanggil anggota antarmuka abstrak statis

Anda mungkin melihat kesalahan berikut saat mencoba memanggil anggota yang didefinisikan sebagai static abstract atau static virtual anggota antarmuka:

  • CS8920: Antarmuka tidak dapat digunakan sebagai argumen jenis. Anggota statis tidak memiliki implementasi yang paling spesifik dalam antarmuka.
  • CS8926: Anggota antarmuka virtual atau abstrak statis hanya dapat diakses pada parameter jenis.

Saat Anda menggunakan antarmuka dengan anggota abstrak statis sebagai argumen jenis, pastikan bahwa semua anggota abstrak statis memiliki implementasi paling spesifik yang tersedia (CS8920). Anda melihat kesalahan ini ketika pengkompilasi tidak dapat menentukan implementasi mana yang akan digunakan, biasanya karena beberapa hierarki antarmuka menyediakan implementasi default yang bertentangan atau tidak ada implementasi.

Akses anggota antarmuka abstrak statis atau virtual statis melalui parameter tipe yang diberi batasan untuk mengimplementasikan antarmuka, bukan melalui tipe antarmuka secara langsung (CS8926). Misalnya, gunakan T.MemberName di mana T dibatasi oleh where T : IMyInterface, bukan IMyInterface.MemberName. Pengompilasi membutuhkan tipe konkret untuk menentukan implementasi mana yang akan dipanggil, dan parameter tipe yang dibatasi menyediakan tipe konkret tersebut pada waktu kompilasi melalui spesialisasi generik.

Untuk informasi selengkapnya tentang mengakses anggota abstrak statis, lihat anggota abstrak statis di antarmuka.