Mengatasi kesalahan dan peringatan yang terkait dengan deklarasi atribut atau penggunaan atribut dalam kode Anda

Artikel ini membahas kesalahan pengkompilasi berikut:

  • CS0181: Parameter konstruktor atribut memiliki jenis, yang bukan jenis parameter atribut yang valid
  • CS0243: Atribut Kondisional tidak valid pada 'metode' karena merupakan metode penimpaan.
  • CS0404: Atribut tidak valid pada jenis deklarasi ini.
  • CS0415: Atribut ini hanya valid pada pengindeks yang bukan merupakan deklarasi anggota antarmuka eksplisit.
  • CS0416: 'parameter tipe': argumen atribut tidak dapat menggunakan parameter tipe.
  • CS0447: Atribut tidak dapat digunakan dengan argumen jenis.
  • CS0577: Atribut Bersyarat tidak valid karena merupakan konstruktor, destruktor, operator, ekspresi lambda, atau implementasi antarmuka eksplisit.
  • CS0578: Atribut Kondisional tidak valid pada 'function' karena jenis pengembaliannya tidak batal.
  • CS0579: Atribut duplikat
  • CS0582: Atribut kondisional tidak valid pada anggota antarmuka.
  • CS0592: Atribut tidak valid pada jenis deklarasi ini. Ini hanya berlaku pada deklarasi tertentu.
  • CS0609: Tidak dapat mengatur atribut pada pengindeks yang ditandai sebagai override.
  • CS0616: Jenis bukan kelas atribut
  • CS0625: Bidang instans dalam jenis yang ditandai dengan StructLayout(LayoutKind.Explicit) harus memiliki atribut FieldOffset.
  • CS0629: Anggota kondisional 'anggota' tidak dapat mengimplementasikan anggota antarmuka 'anggota kelas dasar' dari tipe 'Tipe Nama'.
  • CS0636: Atribut FieldOffset hanya dapat ditempatkan pada anggota jenis yang ditandai dengan StructLayout(LayoutKind.Explicit).
  • CS0637: Atribut FieldOffset tidak diizinkan pada bidang statis atau const.
  • CS0641: Atribut ini hanya valid pada kelas yang berasal dari System.Attribute'.
  • CS0646: Tidak dapat menentukan atribut DefaultMember pada jenis yang berisi pengindeks.
  • CS0647: Kesalahan saat memancarkan atribut
  • CS0653: Tidak dapat menerapkan kelas atribut 'class' karena abstrak.
  • CS0657: Lokasi bukan lokasi atribut yang valid untuk deklarasi ini. Lokasi atribut yang valid untuk deklarasi ini tercantum. Semua atribut dalam blok ini akan diabaikan.
  • CS0658: Lokasi bukan lokasi atribut yang dikenali. Lokasi atribut yang valid untuk deklarasi ini tercantum. Semua atribut dalam blok ini akan diabaikan.
  • CS0668: Dua pengindeks memiliki nama yang berbeda; atribut IndexerName harus digunakan dengan nama yang sama pada setiap pengindeks dalam jenis
  • CS0685: Anggota bersyarat 'anggota' tidak dapat memiliki parameter out.
  • CS0735: Jenis tidak valid yang ditentukan sebagai argumen untuk atribut TypeForwardedTo
  • CS0739: Duplikat TypeForwardedToAttribute
  • CS1608: Atribut RequiredAttribute tidak diizinkan pada jenis C#
  • CS1614: Nama atribut bersifat ambigu. Gunakan '@name' atau secara eksplisit menyertakan akhiran 'Atribut'.
  • CS1618: Tidak dapat membuat delegat dengan metode karena metode tersebut atau metode yang digantikannya memiliki atribut Kondisional
  • CS1667: Atribut tidak valid pada aksesor properti atau peristiwa. Ini hanya berlaku pada deklarasi tertentu.
  • CS1689: Atribut hanya valid pada metode atau kelas atribut
  • CS7014: Atribut tidak valid dalam konteks ini.
  • CS7046: Parameter atribut harus ditentukan.
  • CS7047: Parameter atribut 'parameter1' atau 'parameter2' harus ditentukan.
  • CS7067: Parameter konstruktor atribut bersifat opsional, tetapi tidak ada nilai parameter default yang ditentukan.
  • CS8423: Atribut 'attribute' tidak valid untuk aksesor event. Atribut ini hanya valid pada deklarasi 'declaration'.
  • CS8783: Fungsi lokal 'method' harus berupa 'static' agar dapat menggunakan atribut Conditional
  • CS8959: CallerArgumentExpressionAttribute tidak dapat diterapkan karena tidak ada konversi standar dari type1 ke type2
  • CS8960: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan berpengaruh. Hal ini dikesampingkan oleh CallerLineNumberAttribute.
  • CS8961: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan berpengaruh. Atribut ini digantikan oleh CallerFilePathAttribute.
  • CS8962: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan memberikan efek. Ini digantikan oleh CallerMemberNameAttribute.
  • CS8963: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan berpengaruh. Ini diterapkan dengan nama parameter yang tidak valid.
  • CS8968: Argumen jenis atribut tidak dapat menggunakan parameter jenis
  • CS8970: Jenis tidak dapat digunakan dalam konteks ini karena tidak dapat diwakili dalam metadata.
  • CS9331: Atribut tidak dapat diterapkan secara manual.

Argumen dan parameter atribut

Anda melihat kesalahan berikut saat salah menggunakan argumen atribut atau parameter:

  • CS0181: Parameter konstruktor atribut memiliki jenis, yang bukan jenis parameter atribut yang valid
  • CS0416: 'parameter tipe': argumen atribut tidak dapat menggunakan parameter tipe.
  • CS0447: Atribut tidak dapat digunakan dengan argumen jenis.
  • CS0647: Kesalahan saat memancarkan atribut
  • CS7046: Parameter atribut harus ditentukan.
  • CS7047: Parameter atribut 'parameter1' atau 'parameter2' harus ditentukan.
  • CS7067: Parameter konstruktor atribut bersifat opsional, tetapi tidak ada nilai parameter default yang ditentukan.
  • CS8968: Argumen jenis atribut tidak dapat menggunakan parameter jenis
  • CS8970: Jenis tidak dapat digunakan dalam konteks ini karena tidak dapat diwakili dalam metadata.

Untuk memperbaiki kesalahan ini, ikuti aturan berikut:

  • Parameter konstruktor atribut harus menggunakan jenis parameter atribut yang valid (CS0181). Spesifikasi bahasa C# membatasi jenis parameter atribut ke jenis primitif (bool, byte, char, double, float, int, long, short, dan string), object, System.Type, jenis enum, dan array dimensi tunggal dari jenis-jenis ini. Penunjuk fungsi dan jenis lain yang tidak dapat diwakili dalam metadata bukan jenis parameter atribut yang valid.
  • Argumen atribut harus berupa nilai konstanta waktu kompilasi, sehingga Anda tidak dapat menggunakan parameter jenis sebagai argumen atribut (CS0416). Pengkompilasi harus menyelesaikan argumen atribut pada waktu kompilasi, dan parameter jenis tidak diketahui sampai jenis generik dibuat.
  • Anda tidak dapat menerapkan argumen jenis ke atribut non-generik (CS0447). Jika kelas atribut tidak generik, penggunaannya tidak dapat menyertakan argumen jenis dalam tanda kurung sudut.
  • Semua nilai yang diteruskan ke konstruktor atribut harus diformat dengan benar dan dalam rentang yang valid untuk setiap parameter (CS0647). Misalnya, GuidAttribute memerlukan string format GUID yang valid.
  • Anda harus menyediakan semua parameter atribut yang diperlukan saat menerapkan atribut (CS7046, CS7047). Periksa tanda tangan konstruktor atribut untuk menentukan parameter mana yang wajib, dan berikan argumen yang valid untuk setiap parameter.
  • Saat Anda menentukan atribut kustom dengan parameter konstruktor opsional, tentukan nilai default untuk parameter tersebut (CS7067). Gunakan sintaks parameterType parameterName = defaultValue dalam konstruktor atribut sehingga penelepon dapat menghilangkan argumen tersebut.
  • Argumen jenis atribut generik harus berupa jenis konkret, bukan parameter tipe (CS8968). Pengkompilasi harus sepenuhnya menentukan argumen jenis atribut generik pada waktu kompilasi, sehingga parameter jenis terbuka tidak diizinkan.
  • Jenis yang digunakan sebagai argumen atribut harus dapat diwakili dalam metadata (CS8970). Beberapa jenis yang dibuat, seperti yang melibatkan dynamic atau nama elemen tuple tertentu, tidak dapat dikodekan dalam metadata dan tidak diizinkan sebagai argumen jenis atribut.

Untuk informasi selengkapnya, lihat Atribut, Generik, dan bagian spesifikasi bahasa C# pada atribut.

Nota

CS0447 dan CS0647 tidak digunakan lagi. Pengkompilasi saat ini tidak mengeluarkan kesalahan ini.

Persyaratan kelas atribut

Anda melihat kesalahan berikut saat menentukan kelas atribut yang tidak memenuhi batasan yang diperlukan:

  • CS0404: Atribut tidak valid pada jenis deklarasi ini.
  • CS0579: Atribut duplikat
  • CS0616: Jenis bukan kelas atribut
  • CS0641: Atribut ini hanya valid pada kelas yang berasal dari System.Attribute'.
  • CS0653: Tidak dapat menerapkan kelas atribut 'class' karena abstrak.
  • CS1614: Nama atribut bersifat ambigu. Gunakan '@name' atau secara eksplisit menyertakan akhiran 'Atribut'.

Untuk memperbaiki kesalahan ini, ikuti aturan berikut:

  • Terapkan atribut hanya untuk jenis deklarasi yang diizinkan atribut AttributeUsageAttribute (CS0404). AttributeTargets Periksa nilai yang ditentukan dalam atribut AttributeUsage untuk melihat target mana yang valid.
  • Jika Anda menerapkan atribut yang sama lebih dari sekali ke satu target, hapus duplikat atau atur AllowMultiple = true dalam atribut AttributeUsageAttribute (CS0579). Secara default, atribut hanya dapat muncul sekali pada setiap target.
  • Jenis yang digunakan dalam sintaks atribut harus mewarisi dari System.Attribute (CS0616). Hanya kelas yang berasal dari System.Attribute yang dapat digunakan sebagai atribut. Jenis lain menyebabkan kesalahan ini bahkan jika mereka memiliki nama yang sama.
  • Anda hanya dapat menerapkan AttributeUsageAttribute ke kelas yang berasal dari Attribute (CS0641). Atribut AttributeUsage mengontrol bagaimana atribut lain digunakan, dan itu sendiri dibatasi untuk kelas atribut.
  • Kelas atribut tidak boleh abstract karena pengkompilasi harus membuat instansnya (CS0653). Hapus pengubah abstract dari kelas atribut, atau dapatkan kelas beton dari basis abstrak.
  • Ketika kelas atribut Example dan ExampleAttribute ada, pengkompilasi tidak dapat menentukan mana yang [Example] dirujuk (CS1614). Untuk membedakan, gunakan [@Example] untuk nama yang lebih pendek, atau [ExampleAttribute] untuk nama yang lebih panjang.

Untuk informasi selengkapnya, lihat Membuat atribut kustom dan bagian spesifikasi bahasa C# pada atribut.

Konteks lokasi atribut

Kesalahan berikut terjadi saat Anda menerapkan atribut di lokasi yang tidak valid atau menggunakan penentu target yang salah:

  • CS0592: Atribut tidak valid pada jenis deklarasi ini. Ini hanya berlaku pada deklarasi tertentu.
  • CS0657: Lokasi bukan lokasi atribut yang valid untuk deklarasi ini. Lokasi atribut yang valid untuk deklarasi ini tercantum. Semua atribut dalam blok ini akan diabaikan.
  • CS0658: Lokasi bukan lokasi atribut yang dikenali. Lokasi atribut yang valid untuk deklarasi ini tercantum. Semua atribut dalam blok ini akan diabaikan.
  • CS1667: Atribut tidak valid pada aksesor properti atau peristiwa. Ini hanya berlaku pada deklarasi tertentu.
  • CS7014: Atribut tidak valid dalam konteks ini.
  • CS8423: Atribut 'attribute' tidak sah pada pengakses event. Atribut ini hanya sah untuk deklarasi 'declaration'.

Untuk memperbaiki kesalahan ini, ikuti aturan ini. Untuk informasi selengkapnya, lihat Target Atribut dan bagian spesifikasi bahasa C# pada spesifikasi atribut.

  • Setiap atribut AttributeUsageAttribute menentukan jenis deklarasi mana yang ditargetkannya. Anda harus menerapkan atribut hanya untuk jenis tersebut (CS0592). Misalnya, Anda tidak dapat menerapkan atribut yang ditentukan dengan AttributeTargets.Interface ke kelas.
  • Saat Anda menggunakan penentu target atribut seperti method: atau property:, penentu harus valid untuk deklarasi tempatnya muncul (CS0657). Periksa pesan kesalahan untuk melihat penentu target mana yang diizinkan untuk deklarasi tertentu.
  • Penentu target atribut yang Anda gunakan bukan penentu yang dikenali (CS0658). Penentu yang valid meliputi assembly:, , module:type:, method:, property:, field:, event:, param:, dan return:.
  • Beberapa atribut, seperti ObsoleteAttribute dan CLSCompliantAttribute, tidak valid pada aksesor properti atau peristiwa (CS1667). Pindahkan atribut dari aksesor ke properti atau deklarasi peristiwa itu sendiri.
  • Atribut hanya dapat muncul pada elemen program yang mendukungnya (CS7014). Jika Anda menerapkan atribut tingkat rakitan atau tingkat modul, gunakan assembly: penentu target atau module: dan letakkan di bagian atas file.
  • Atribut pada aksesor peristiwa add dan remove tidak diperbolehkan (CS8423). Terapkan atribut ke deklarasi peristiwa, atau gunakan target yang valid seperti method: atau param: pada deklarasi yang mendukung target tersebut.

Atribut yang telah ditentukan sebelumnya

Kesalahan berikut terjadi ketika Anda salah menggunakan atribut .NET tertentu yang telah ditentukan sebelumnya:

  • CS0415: Atribut ini hanya valid pada pengindeks yang bukan merupakan deklarasi anggota antarmuka eksplisit.
  • CS0609: Tidak dapat menetapkan atribut pada pengindeks yang ditandai sebagai override.
  • CS0625: Bidang instans dalam jenis yang ditandai dengan StructLayout(LayoutKind.Explicit) harus memiliki atribut FieldOffset.
  • CS0636: Atribut FieldOffset hanya dapat ditempatkan pada anggota jenis yang ditandai dengan StructLayout(LayoutKind.Explicit).
  • CS0637: Atribut FieldOffset tidak diizinkan pada bidang statis atau const.
  • CS0646: Tidak dapat menentukan atribut DefaultMember pada jenis yang berisi pengindeks.
  • CS0668: Dua pengindeks memiliki nama yang berbeda; atribut IndexerName harus digunakan dengan nama yang sama pada setiap pengindeks dalam jenis
  • CS0735: Jenis tidak valid yang ditetapkan sebagai argumen untuk atribut TypeForwardedTo
  • CS0739: Duplikat TypeForwardedToAttribute
  • CS1608: Atribut RequiredAttribute tidak diizinkan pada jenis C#
  • CS9331: Atribut tidak dapat diterapkan secara manual.

Untuk memperbaiki kesalahan ini, ikuti aturan ini. Untuk informasi selengkapnya, lihat Pengindeks, Jenis struktur, TypeForwardedToAttribute, dan Pemanggilan Platform (P/Panggil).

  • Anda hanya dapat menerapkan IndexerNameAttribute ke pengindeks yang bukan deklarasi anggota antarmuka eksplisit (CS0415). Hapus atribut dari pengindeks antarmuka eksplisit, karena antarmuka sudah menentukan nama pengindeks.
  • Anda tidak dapat menerapkan IndexerName ke pengindeks yang ditandai dengan override karena pengindeks override mewarisi namanya dari kelas dasar (CS0609). Hapus atribut IndexerName dari pengindeks override.
  • Setiap bidang instans dalam tipe yang ditandai dengan StructLayout(LayoutKind.Explicit) harus memiliki FieldOffsetAttribute (CS0625). Tata letak eksplisit mengharuskan Anda menentukan byte offset untuk setiap field instance.
  • Anda hanya dapat menempatkan FieldOffsetAttribute pada anggota tipe yang nilai StructLayoutAttribute-nya diatur ke LayoutKind.Explicit (CS0636). Tambahkan atribut StructLayout ke deklarasi jenis yang berisi.
  • Atribut FieldOffset tidak diizinkan pada static bidang atau const karena tata letak eksplisit hanya berlaku untuk bidang instans (CS0637). FieldOffset Hapus atribut dari bidang statis atau const.
  • Anda tidak dapat menerapkan DefaultMemberAttribute ke jenis yang sudah berisi pengindeks karena pengkompilasi secara otomatis menentukan anggota default untuk jenis dengan pengindeks (CS0646). Hapus atribut DefaultMember.
  • Semua IndexerNameAttribute atribut dalam jenis harus menentukan nama yang sama (CS0668). Ubah nama agar sesuai, karena runtime menggunakan satu nama untuk semua pengindeks dari sebuah tipe.
  • Anda harus menentukan tipe non-generik, tidak bertingkat, non-pointer, dan non-array sebagai argumen untuk TypeForwardedToAttribute (CS0735). Hanya jenis bernama tingkat atas yang merupakan target penerusan yang valid.
  • Rakitan hanya dapat memiliki satu TypeForwardedToAttribute untuk setiap jenis eksternal (CS0739). Temukan dan hapus deklarasi duplikat TypeForwardedTo .
  • Anda tidak dapat menggunakan RequiredAttributeAttribute pada tipe yang ditentukan dalam C# (CS1608). Atribut ini dicadangkan untuk bahasa lain yang perlu memaksa pengkompilasi untuk memerlukan fitur tertentu.
  • Beberapa atribut dicadangkan untuk pengkompilasi dan tidak dapat diterapkan secara manual dalam kode sumber (CS9331). Ganti atribut dengan sintaks bahasa C# yang setara yang menyebabkan pengkompilasi menghasilkannya.

Penggunaan atribut kondisional

Anda melihat kesalahan berikut saat menerapkan ConditionalAttribute dengan cara yang melanggar batasan penggunaannya:

  • CS0243: Atribut Kondisional tidak valid pada 'metode' karena merupakan metode penimpaan.
  • CS0577: Atribut Bersyarat tidak valid karena merupakan konstruktor, destruktor, operator, ekspresi lambda, atau implementasi antarmuka eksplisit.
  • CS0578: Atribut Kondisional tidak valid pada 'function' karena jenis pengembaliannya tidak batal.
  • CS0582: Atribut kondisional tidak valid pada anggota antarmuka.
  • CS0629: Anggota bersyarat 'anggota' tidak dapat menerapkan anggota antarmuka 'anggota kelas dasar' dalam tipe 'Nama Tipe'.
  • CS0685: Anggota bersyarat 'anggota' tidak dapat memiliki parameter out.
  • CS1618: Tidak dapat membuat deleget dengan metode karena metode atau metode yang ditimpanya memiliki atribut Kondisional
  • CS1689: Atribut hanya valid pada metode atau kelas atribut
  • CS8783: Fungsi lokal 'method' harus 'static' agar dapat menggunakan atribut Conditional

Untuk memperbaiki kesalahan ini, ikuti aturan ini. Untuk informasi lebih lanjut, lihat ConditionalAttribute, Metode bersyarat, dan Atribut.

  • Kompilator mengikat panggilan ke deklarasi metode dasar, bukan ke override, sehingga Anda tidak dapat menerapkan atribut Conditional untuk metode override (CS0243). Hapus atribut Conditional dari metode override, atau hapus kata kunci override.
  • Atribut Conditional ini tidak valid pada konstruktor, finalizer, operator, ekspresi lambda, atau implementasi antarmuka eksplisit (CS0577). Jenis anggota ini tidak dapat dihilangkan secara kondisional karena mereka memiliki peran yang diperlukan dalam siklus hidup atau kontrak jenis.
  • Metode kondisional harus mengembalikan void karena compiler dapat mengabaikan pemanggilan secara keseluruhan, dan tidak ada nilai pengembalian yang akan tersedia untuk pemanggil (CS0578). Ubah jenis pengembalian metode menjadi void, atau hapus Conditional atribut .
  • Anggota antarmuka tidak dapat bersifat kondisional karena semua anggota antarmuka harus diimplementasikan (CS0582). Conditional Hapus atribut dari deklarasi anggota antarmuka.
  • Metode yang menerapkan anggota antarmuka tidak dapat bersyarat karena kontrak antarmuka mengharuskan mereka hadir di semua build (CS0629). Conditional Hapus atribut dari metode penerapan.
  • Metode kondisional tidak dapat memiliki out parameter karena nilai variabel out akan menjadi tidak terdefinisi ketika kompilator menghilangkan panggilan metode (CS0685). out Hapus parameter dari metode , atau hapus Conditional atribut .
  • Anda tidak dapat membuat delegasi yang mereferensikan metode kondisional karena metode mungkin tidak ada dalam build di mana simbol kondisi tidak didefinisikan (CS1618). Conditional Hapus atribut dari metode , atau jangan gunakan sebagai target delegasi.
  • Atribut Conditional hanya valid pada metode dan kelas atribut (CS1689). Ini tidak valid pada jenis deklarasi lain seperti kelas non-atribut, struktur, atau antarmuka.
  • Fungsi lokal harus dinyatakan static untuk menggunakan Conditional atribut (CS8783). Fungsi lokal non-statis menangkap status dari metode penutup, dan pengkompilasi tidak dapat dengan aman menghilangkan panggilan yang mungkin melibatkan variabel yang ditangkap. Tambahkan pengubah static ke fungsi lokal, atau hapus [Conditional] atribut .

Penggunaan atribut CallerArgumentExpression

Kesalahan berikut terjadi saat Anda salah menerapkan CallerArgumentExpressionAttribute atau bertentangan dengan atribut info pemanggil lainnya:

  • CS8959: CallerArgumentExpressionAttribute tidak dapat diterapkan karena tidak ada konversi standar dari type1 ke type2
  • CS8960: CallerArgumentExpressionAttribute yang diterapkan pada parameter ini tidak akan memiliki efek. Ini digantikan oleh CallerLineNumberAttribute.
  • CS8961: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan memberikan efek. Ini akan dikesampingkan oleh CallerFilePathAttribute.
  • CS8962: CallerArgumentExpressionAttribute yang digunakan pada parameter tidak akan berpengaruh. Ini digantikan oleh CallerMemberNameAttribute.
  • CS8963: CallerArgumentExpressionAttribute yang diterapkan pada parameter tidak akan berpengaruh. Ini diterapkan dengan nama parameter yang tidak valid.

Untuk memperbaiki kesalahan ini, ikuti aturan ini. Untuk informasi selengkapnya, lihat Atribut informasi pemanggil dan CallerArgumentExpressionAttribute.

  • Parameter yang dihiasi dengan CallerArgumentExpression harus memiliki tipe string atau tipe dengan konversi standar dari string, karena atribut tersebut menyuntikkan string sebagai representasi ekspresi argumen pemanggil (CS8959). Ubah jenis parameter menjadi string atau jenis yang kompatibel.
  • Atribut CallerArgumentExpression tidak berpengaruh pada parameter yang juga memiliki CallerLineNumberAttribute, , CallerFilePathAttributeatau CallerMemberNameAttribute (CS8960, CS8961, CS8962). Atribut info penelepon tersebut memiliki prioritas, jadi hapus atribut CallerArgumentExpression dari parameter.
  • Argumen string yang CallerArgumentExpression diteruskan ke konstruktor harus cocok dengan nama parameter lain dalam tanda tangan metode yang sama (CS8963). Jika nama parameter salah eja atau mengacu pada parameter yang tidak ada, atribut tidak berpengaruh.