Bagikan melalui


Kesalahan dan peringatan yang terkait dengan pengubah params pada parameter metode

Ada beberapa kesalahan yang terkait dengan lock pernyataan dan sinkronisasi utas:

  • CS0225: Parameter param harus berupa array dimensi tunggal atau memiliki jenis koleksi yang valid
  • CS0231: Parameter param harus menjadi parameter terakhir dalam daftar parameter formal.
  • CS0466: 'method1' seharusnya tidak memiliki parameter param karena 'method2' tidak
  • CS0674: Jangan gunakan System.ParamArrayAttribute atau System.ParamArrayAttribute/System.Runtime.CompilerServices.ParamCollectionAttribute. Gunakan kata kunci sebagai gantinya params .
  • CS0758: Kedua deklarasi metode parsial harus menggunakan params parameter atau tidak boleh menggunakan params parameter
  • CS1104: Array parameter tidak dapat digunakan dengan this pengubah pada metode ekstensi.
  • CS1611: Parameter param tidak dapat dideklarasikan sebagai dalam ref atau out
  • CS1670: params tidak valid dalam konteks ini
  • CS1751: Tidak dapat menentukan nilai default untuk array parameter.
  • CS9218: Argumen jenis untuk metode tidak dapat disimpulkan dari penggunaan karena argumen dengan jenis dinamis digunakan dan metode memiliki parameter pengumpulan param non-array. Coba tentukan argumen jenis secara eksplisit.
  • CS9219: Ambiguitas antara bentuk yang diperluas dan normal dari parameter pengumpulan param non-array, satu-satunya argumen yang sesuai memiliki jenis dynamic. Pertimbangkan untuk melemparkan argumen dinamis.
  • CS9223: Pembuatan koleksi param menghasilkan rantai pemanggilan konstruktor yang tak terbatas.
  • CS9224: Metode tidak boleh kurang terlihat daripada anggota dengan koleksi param.
  • CS9225: Konstruktor membuat anggota yang diperlukan tidak diinisialisasi.
  • CS9227: Jenis tidak berisi definisi untuk metode instans Add yang sesuai.
  • CS9228: Jenis koleksi param non-array harus memiliki konstruktor yang berlaku yang dapat dipanggil tanpa argumen.

Selain itu, pengkompilasi mungkin menghasilkan peringatan berikut yang terkait dengan params pengubah pada parameter metode:

  • CS9220: Satu atau beberapa kelebihan metode yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.
  • CS9221: Satu atau beberapa overload pengindeks yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.
  • CS9222: Satu atau beberapa kelebihan konstruktor yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.

Aturan deklarasi metode

Kesalahan berikut menunjukkan penggunaan params pengubah pada parameter saat pengubah tidak diizinkan dalam konteks tersebut params :

  • CS0231: Parameter param harus menjadi parameter terakhir dalam daftar parameter formal.
  • CS1104: Array parameter tidak dapat digunakan dengan this pengubah pada metode ekstensi.
  • CS1611: Parameter param tidak dapat dideklarasikan sebagai dalam ref atau out
  • CS1670: params tidak valid dalam konteks ini
  • CS1751: Tidak dapat menentukan nilai default untuk array parameter.

Kompilator memberlakukan aturan berikut tentang penggunaan params pengubah pada parameter metode:

  • Pengubah params hanya diperbolehkan pada parameter terakhir dalam daftar parameter formal. Ini termasuk parameter apa pun dengan nilai default.
  • Anda tidak dapat menyertakan argumen default untuk parameter saat pengubah params digunakan.
  • Pengubah params tidak dapat diterapkan ke parameter referensi. Parameter referensi adalah satu dengan in, , ref readonlyref atau out pengubah.
  • Pengubah params tidak dapat dikombinasikan dengan pengubah this pada metode ekstensi.
  • Pengubah params tidak dapat digunakan pada operator yang kelebihan beban.

Dalam versi sebelum C# 12, pengubah params tidak dapat digunakan pada parameter metode anonim atau ekspresi lambda.

Aturan jenis parameter dan argumen

Kesalahan berikut menunjukkan bahwa jenis parameter yang digunakan dengan params tidak valid:

  • CS9218: Argumen jenis untuk metode tidak dapat disimpulkan dari penggunaan karena argumen dengan jenis dinamis digunakan dan metode memiliki parameter pengumpulan param non-array. Coba tentukan argumen jenis secara eksplisit.
  • CS9219: Ambiguitas antara bentuk yang diperluas dan normal dari parameter pengumpulan param non-array, satu-satunya argumen yang sesuai memiliki jenis 'dinamis'. Pertimbangkan untuk melemparkan argumen dinamis.
  • CS0225: Parameter param harus berupa array dimensi tunggal atau memiliki jenis koleksi yang valid
  • CS9227: Jenis tidak berisi definisi untuk metode instans Add yang sesuai.
  • CS9228: Jenis koleksi param non-array harus memiliki konstruktor yang berlaku yang dapat dipanggil tanpa argumen.

Peringatan berikut menunjukkan bahwa salah satu kemungkinan kelebihan beban mungkin melibatkan pengiriman dinamis. Sifat dinamis argumen tidak berpartisipasi dalam resolusi kelebihan beban.

  • CS9220: Satu atau beberapa kelebihan metode yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.
  • CS9221: Satu atau beberapa overload pengindeks yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.
  • CS9222: Satu atau beberapa kelebihan konstruktor yang memiliki parameter pengumpulan param non-array mungkin hanya berlaku dalam bentuk yang diperluas yang tidak didukung selama pengiriman dinamis.

Dalam versi sebelum C# 13, pengubah params hanya diizinkan pada array dimensi tunggal. Tidak ada jenis lain yang valid.

Dimulai dengan C# 13 jenis koleksi yang valid dapat digunakan. Namun, beberapa batasan tetap ada. Jenis koleksi harus mengikuti aturan yang sama dengan target ekspresi koleksi.

Kesalahan param lainnya

Kesalahan berikut menunjukkan masalah lain dengan menggunakan pengubah params :

  • CS0466: 'method1' seharusnya tidak memiliki parameter param karena 'method2' tidak
  • CS0674: Jangan gunakan System.ParamArrayAttribute atau System.Runtime.CompilerServices.ParamCollectionAttribute. Gunakan kata kunci sebagai gantinya params .
  • CS0758: Kedua deklarasi metode parsial harus menggunakan params parameter atau tidak boleh menggunakan params parameter
  • CS9223: Pembuatan koleksi param menghasilkan rantai pemanggilan konstruktor yang tak terbatas.
  • CS9224: Metode tidak boleh kurang terlihat daripada anggota dengan koleksi param.
  • CS9225: Konstruktor membuat anggota yang diperlukan tidak diinisialisasi.

Metode yang mengimplementasikan antarmuka harus menyertakan pengubah params jika dan hanya jika anggota antarmuka memiliki pengubah params . Demikian pula, kedua deklarasi partial metode harus menyertakan pengubah params , atau tidak ada yang dapat menyertakan pengubah params .

Anda harus menggunakan pengubah params . Anda tidak dapat menerapkan atribut yang setara, baik System.ParamArrayAttribute atau System.Runtime.CompilerServices.ParamCollectionAttribute.

Pengkompilasi menghasilkan salah satu dari tiga kesalahan terakhir dalam daftar sebelumnya ketika kode yang dihasilkan untuk membuat jenis koleksi tidak valid:

  • Pengkompilasi memancarkan CS9223 ketika kode yang dipancarkan untuk membuat koleksi juga berisi koleksi param dengan jenis yang sama. Biasanya, metode ini Add mengambil params koleksi dengan jenis yang sama.
  • Pengkompilasi memancarkan CS9224 ketika Create metode untuk jenis koleksi kurang dapat diakses daripada metode yang mengambil params parameter jenis koleksi.
  • Pengkompilasi memancarkan CS9225 ketika jenis koleksi memiliki anggota yang diperlukan dan konstruktor tanpa parameter tidak menginisialisasi anggota tersebut System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute dan memiliki pada konstruktor tanpa parameter.

Lihat juga