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:
- CS0056: Aksesibilitas tidak konsisten: tipe pengembalian 'tipe' kurang dapat diakses daripada operator 'operator'
- CS0057: Aksesibilitas yang tidak konsisten: jenis parameter 'type' kurang dapat diakses daripada operator 'operator'
- CS0215: Jenis pengembalian operator True atau False harus bool
- CS0216: Operator 'operator' memerlukan operator yang cocok 'missing_operator' harus juga didefinisikan
- CS0217: Agar dapat diterapkan sebagai operator sirkuit pendek operator logis yang ditentukan pengguna ('operator') harus memiliki jenis pengembalian yang sama dengan jenis 2 parameternya.
- CS0218: Jenis ('type') harus berisi deklarasi operator true dan operator false
-
CS0448: Tipe pengembalian untuk operator
++atau--harus berupa tipe yang mencakup atau diturunkan dari tipe yang mencakup tersebut - CS0552: 'rutinitas konversi' : konversi yang ditentukan pengguna ke/dari antarmuka
- CS0553: 'rutinitas konversi' : konversi yang ditentukan pengguna ke/dari kelas dasar
- CS0554: 'rutinitas konversi' : konversi yang ditentukan pengguna ke/dari kelas turunan
- CS0555: Operator yang ditentukan pengguna tidak dapat menerima objek dari jenis penutup dan mengonversinya menjadi objek dari jenis penutup
- CS0556: Konversi yang ditentukan pengguna harus dikonversi ke atau dari jenis penutup
- CS0557: Duplikasi konversi yang ditentukan pengguna pada tipe
- CS0558: Operator yang ditentukan pengguna harus dinyatakan statis dan publik
-
CS0559: Jenis parameter untuk
++atau--operator harus berupa jenis yang berisi - CS0562: Parameter operator unary harus berupa tipe yang mengandung
- CS0563: Salah satu parameter operator biner harus berupa jenis yang berisi
- CS0564: Operand pertama operator shift yang kelebihan beban harus memiliki jenis yang sama dengan jenis yang berisi, dan jenis operand kedua harus int
- CS0567: Antarmuka tidak boleh berisi operator
- CS0590: Operator yang ditentukan pengguna tidak dapat mengembalikan kekosongan
-
CS0660: Jenis mendefinisikan
operator ==atauoperator !=tetapi tidak mengambil alihObject.Equals(object o) -
CS0661: Jenis mendefinisikan
operator ==atauoperator !=tetapi tidak mengambil alihObject.GetHashCode() - CS0715: Kelas statis tidak boleh berisi operator yang ditentukan pengguna
- CS1037: Operator yang dapat kelebihan beban diharapkan
- CS1553: Deklarasi tidak valid; gunakan 'modifier operator <dest-type> (...) sebagai gantinya
- 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
- CS9023: Operator tidak dapat dibuat diperiksa.
- CS9024: Operator tidak dapat dibuat bebas dari pengecekan.
- CS9025: Operator memerlukan versi yang tidak dicentang yang cocok untuk juga dideklarasikan.
- CS9027: Kata kunci tak terduga 'tidak dicentang'.
- CS9308: Operator yang ditentukan pengguna harus dinyatakan publik.
- CS9310: Jenis pengembalian untuk operator ini harus void.
- CS9311: Jenis tidak menerapkan anggota antarmuka. Tipe tidak dapat menerapkan anggota karena salah satunya bukan operator.
- CS9312: Jenis tidak dapat mengambil alih anggota yang diwariskan karena salah satunya bukan operator.
- CS9313: Operator penetapan senyawa yang kelebihan beban mengambil satu parameter.
- CS9340: Operator tidak dapat diterapkan ke operand. Kandidat terdekat yang tidak dapat diaplikasikan ditampilkan.
- CS9341: Operator tidak dapat diterapkan ke operand. Kandidat terdekat yang tidak dapat diaplikasikan ditampilkan.
- CS9342: Resolusi operator ambigu antara anggota berikut.
Persyaratan tanda tangan operator
-
CS0448: Jenis pengembalian untuk
++atau--operator harus berupa jenis yang berisi atau berasal dari jenis yang berisi. -
CS0559: Jenis parameter untuk
++atau--operator harus berupa jenis yang berisi. - CS0562: Parameter pada operator unary harus berupa tipe yang memuatnya.
- CS0563: Salah satu parameter operator biner harus berupa jenis yang berisi.
- CS0564: Operand pertama pada operator shift yang di-overload harus memiliki tipe yang sama dengan tipe yang memuatnya, dan tipe operand kedua harus int.
- CS0567: Antarmuka tidak dapat berisi operator.
- CS0590: Operator yang ditentukan pengguna tidak dapat mengembalikan kekosongan.
- CS9310: Jenis pengembalian untuk operator ini seharusnya void.
- CS9340: Operator tidak dapat diterapkan ke operand. Kandidat terdekat yang tidak dapat diaplikasikan ditampilkan.
- CS9341: Operator tidak dapat diterapkan ke operand. Kandidat terdekat yang tidak dapat diaplikasikan ditampilkan.
- CS9342: Resolusi operator ambigu antara anggota berikut.
Untuk mendeklarasikan operator dengan tanda tangan yang benar, ikuti persyaratan ini untuk jenis operator tertentu. Untuk informasi selengkapnya, lihat Kelebihan beban operator.
- Mengembalikan tipe yang mencakup (atau tipe turunan) dari operator
++dan--(CS0448). - Gunakan tipe yang mengandung sebagai parameter untuk operator
++dan--(CS0559). - Gunakan jenis yang berisi sebagai parameter untuk operator unary (CS0562).
- Sertakan jenis yang berisi sebagai setidaknya satu parameter dalam operator biner (CS0563).
- Gunakan jenis yang berisi sebagai parameter pertama dan
intsebagai parameter kedua untuk operator shift (CS0564). - Jangan mendeklarasikan operator dalam antarmuka (CS0567). Antarmuka tidak dapat berisi implementasi operator.
- Mengembalikan jenis non-void dari sebagian besar operator (CS0590), kecuali untuk operator tertentu yang memerlukan pengembalian
void(CS9310). - Berikan kelebihan beban operator yang menerima jenis parameter yang benar untuk menghindari kegagalan resolusi (CS9340, CS9341).
- Memisahkan panggilan operator dengan menggunakan cast eksplisit atau menyediakan kelebihan beban yang lebih spesifik (CS9342).
Penting
Syarat tanda tangan untuk operator biner statis dan operator penetapan gabungan instance yang sesuai berbeda. Pastikan tanda tangan cocok dengan deklarasi yang Anda inginkan.
Contoh berikut menunjukkan kesalahan tanda tangan:
class C1
{
public static int operator ++(C1 c) => 0; // CS0448
public static C1 operator --(C1 c) => null; // OK
}
public class C2
{
public static implicit operator int(C2 x) => 0;
public static implicit operator C2(int x) => new C2();
public static int operator ++(int aa) => 0; // CS0559
}
public class C3
{
public static implicit operator int(C3 x) => 0;
public static implicit operator C3(int x) => null;
public static C3 operator +(int aa) => 0; // CS0562
}
public class C4
{
public static implicit operator int(C4 x) => 0;
public static implicit operator C4(int x) => null;
public static int operator +(int aa, int bb) => 0; // CS0563
}
class C5
{
// To correct, change second operand to int, like so:
// public static int operator << (C c1, int c2)
public static int operator <<(C5 c1, C5 c2) => 0; // CS0564
}
interface IA
{
int operator +(int aa, int bb); // CS0567
}
public class C6
{
public static void operator +(C6 A1, C6 A2) { } // CS0590
}
Persyaratan deklarasi operator
- CS0558: Operator yang ditentukan pengguna harus dinyatakan statis dan publik.
- CS0715: Kelas statis tidak dapat berisi operator yang ditentukan pengguna.
- CS1037: Operator yang dapat kelebihan beban diharapkan.
- CS1553: Deklarasi tidak valid; gunakan 'modifier operator <dest-type> (...' sebagai gantinya.
- CS9308: Operator yang ditentukan pengguna harus dinyatakan publik.
Untuk mendeklarasikan operator dengan benar, ikuti persyaratan ini untuk pengubah dan jenis yang mengandung. Untuk informasi selengkapnya, lihat Operator kelebihan beban dan operator konversi yang ditentukan pengguna.
- Deklarasikan operator dengan pengubah
staticdanpublic(CS0558, CS9308). - Jangan mendeklarasikan operator di kelas statis (CS0715). Gunakan kelas atau struktur reguler.
- Gunakan simbol operator yang valid dan dapat kelebihan beban (CS1037).
- Ikuti sintaks yang benar untuk operator konversi:
public static implicit/explicit operator <dest-type>(<source-type> parameter)(CS1553).
Untuk kesalahan yang terkait dengan implementasi antarmuka eksplisit operator dalam antarmuka abstrak statis, lihat Kesalahan abstrak statis dan anggota antarmuka virtual.
Contoh berikut menunjukkan kesalahan deklarasi:
public class C
{
static implicit operator int(C aa) => 0; // CS0558, add public
}
public static class C1
{
public static int operator +(C1 c) => 0; // CS0715
}
class C2
{
public static int implicit operator (C2 f) => 6; // CS1553
}
Aksesibilitas yang tidak konsisten
- CS0056: Aksesibilitas yang tidak konsisten: tipe pengembalian 'type' kurang dapat diakses dibandingkan operator 'operator'.
- CS0057: Aksesibilitas yang tidak konsisten: jenis parameter 'type' kurang dapat diakses daripada operator 'operator'.
Untuk memastikan aksesibilitas yang konsisten dalam deklarasi operator, buat semua jenis yang digunakan di operator publik dapat diakses secara publik. Untuk informasi selengkapnya, lihat Pengubah Akses.
- Pastikan tipe pengembalian memiliki tingkat aksesibilitas paling tidak sama dengan operator (CS0056).
- Pastikan jenis parameter memiliki setidaknya aksesibilitas yang sama dengan operator (CS0057).
Saat Anda mendeklarasikan operator, semua jenis yang public digunakan sebagai parameter atau nilai pengembalian juga harus dapat diakses publik.
Contoh berikut menunjukkan kesalahan aksesibilitas:
class C { }
public class C2
{
public static implicit operator C(C2 a) => new C(); // CS0056
}
public class C3
{
public static implicit operator C3(C c) => new C3(); // CS0057
}
Pembatasan konversi yang ditentukan pengguna
- CS0552: Konversi yang ditentukan pengguna ke/dari antarmuka.
- CS0553: Konversi yang ditentukan pengguna ke/dari kelas dasar.
- CS0554: Konversi yang ditentukan pengguna ke/dari kelas turunan.
- CS0555: Operator yang ditentukan pengguna tidak dapat mengambil objek dari tipe yang melingkupi dan mengonversi menjadi objek dari tipe yang melingkupi.
- CS0556: Konversi yang ditentukan pengguna harus dikonversi ke atau dari jenis penutup.
- CS0557: Menduplikasi konversi yang ditentukan pengguna dalam jenis.
Untuk membuat operator konversi yang ditentukan pengguna yang valid, ikuti pembatasan ini. Untuk informasi selengkapnya, lihat Operator konversi yang ditentukan pengguna.
- Jangan tentukan konversi ke atau dari antarmuka (CS0552). Gunakan implementasi antarmuka eksplisit sebagai gantinya.
- Jangan tentukan konversi ke atau dari kelas dasar (CS0553). Konversi sudah ada melalui pewarisan.
- Jangan tentukan konversi ke atau dari kelas turunan (CS0554). Konversi sudah ada melalui pewarisan.
- Jangan tentukan konversi dari jenis penutup ke dirinya sendiri (CS0555). Konversi ini implisit.
- Pastikan setidaknya satu jenis dalam konversi adalah jenis penutup (CS0556). Anda tidak dapat mendefinisikan konversi antara dua jenis eksternal.
- Jangan tentukan konversi duplikat (CS0557). Setiap operator konversi harus unik.
Contoh berikut menunjukkan kesalahan pembatasan konversi:
public interface I
{
}
public class C
{
public static implicit operator I(C aa) => default;// CS0552
}
public class B
{
}
public class D : B
{
public static implicit operator B(D aa) => new B();// CS0553
}
public class B2
{
// delete the conversion routine to resolve CS0554
public static implicit operator B2(D2 d) => new B2();// CS0554
}
public class D2 : B2 { }
public class C2
{
public static implicit operator C2(C2 aa) => new C2(); // CS0555
}
public class C3
{
public static implicit operator int(byte aa) => 0; // CS0556
}
public class C4
{
public static implicit operator int(C4 aa) => 0;
// CS0557, delete duplicate
public static explicit operator int(C4 aa) => 0;
}
Operator Boolean dan sirkuit pendek
- CS0215: Jenis pengembalian operator true atau false harus bool.
- CS0216: Operator mengharuskan adanya operator yang sesuai untuk didefinisikan.
- CS0217: Agar dapat diterapkan sebagai operator sirkuit pendek, operator logis yang ditentukan pengguna harus memiliki jenis pengembalian yang sama dengan jenis 2 parameternya.
- CS0218: Jenis harus berisi deklarasi operator true dan operator false.
Untuk menentukan operator logis dengan benar, ikuti persyaratan pengelompokan dan penanda ini. Untuk informasi selengkapnya, lihat operator benar dan salah, operator logis Boolean, dan operator logis bersyarat yang ditentukan pengguna.
- Mengembalikan
booldarioperator truedanoperator false(CS0215). - Tentukan operator berpasangan yang diperlukan (CS0216):
-
operator ==Memerlukanoperator != -
operator <Memerlukanoperator > -
operator <=Memerlukanoperator >= -
operator trueMemerlukanoperator false
-
- Cocokkan jenis pengembalian dengan jenis parameter untuk operator sirkuit pendek (
&dan|) yang berfungsi dengan jenis kustom (CS0217). - Terapkan kedua
operator truedanoperator falsesaat menggunakan jenis kustom dalam konteks boolean seperti&&dan||(CS0218).
Contoh berikut menunjukkan kesalahan operator logis:
class C
{
public static int operator true(C c) => 0; // CS0215
public static int operator false(C c) => 0; // CS0215
}
class C2
{
public static bool operator ==(C2 left, C2 right) => left.Equals(right); // CS0216
public override bool Equals(object? o) => base.Equals(o);
public override int GetHashCode() => base.GetHashCode();
}
public class C3
{
public static bool operator true(C3 f) => false;
public static bool operator false(C3 f) => true;
public static implicit operator int(C3 x) => 0;
public static int operator &(C3 f1, C3 f2) => new C3(); // CS0217
}
public class C4
{
public static implicit operator int(C4 x) => 0;
public static C4 operator &(C4 f1, C4 f2) => new C4();
public static void Main()
{
C4 f = new C4();
int i = f && f; // CS0218, requires operators true and false
}
}
Operator yang diperiksa
- CS9023: Operator tidak dapat dibuat diperiksa
- CS9024: Operator tidak dapat dibuat tidak diawasi
- CS9025: Operator yang diperiksa memerlukan versi yang tidak dicentang yang cocok untuk juga dideklarasikan
- CS9027: Kata kunci tak terduga 'tidak dicentang'
Untuk menggunakan operator yang terkontrol dengan benar, ikuti persyaratan berikut. Untuk informasi selengkapnya, lihat Operator aritmatika dan operator yang diperiksa yang ditentukan pengguna.
- Terapkan
checkedatauuncheckedkata kunci hanya untuk operator aritmetika yang didukung:+, , ,-*,/,++,--, dan konversi eksplisit (CS9023, CS9024). - Berikan versi yang dicentang dan tidak dicentang saat mendeklarasikan operator yang dicentang (CS9025). Pengkompilasi memerlukan keduanya untuk menangani konteks yang berbeda.
-
uncheckedGunakan kata kunci hanya dalam konteks deklarasi operator yang valid (CS9027). Jangan menempatkannya di lokasi yang tidak sesuai secara sintaksis.
Persyaratan antarmuka dan pewarisan
- CS9311: Jenis tidak menerapkan anggota antarmuka. Jenis tidak dapat menerapkan anggota karena salah satunya bukan operator
- CS9312: Jenis tidak dapat mengambil alih anggota yang diwariskan karena salah satunya bukan operator
- CS9313: Operator penetapan senyawa yang kelebihan beban mengambil satu parameter
Untuk menerapkan dan mengganti operator dengan benar, ikuti persyaratan ini. Untuk informasi selengkapnya, lihat Kelebihan beban operator dan Antarmuka.
- Pastikan deklarasi operator cocok dengan tanda tangan dan jenis anggota antarmuka (CS9311). Operator tidak dapat menerapkan elemen non-operator.
- Verifikasi bahwa anggota yang diwariskan dan di-override juga merupakan operator (CS9312). Operator tidak dapat mengambil alih anggota non-operator.
- Deklarasikan operator penetapan majemuk dengan satu parameter (CS9313). Operand kiri secara implisit
this.
Operator Kesetaraan
- CS0660: Tipe mendefinisikan operator == atau operator != tetapi tidak menggantikan Object.Equals(object o)
- CS0661: Jenis mendefinisikan operator == atau operator != tetapi tidak menimpa Object.GetHashCode()
Untuk menerapkan kesetaraan dengan benar, override metode Object yang sesuai saat menentukan operator kesetaraan kustom. Untuk informasi selengkapnya, lihat Cara menentukan kesetaraan nilai untuk operator jenis dan Kesetaraan.
- Ambil alih Object.Equals saat Anda menentukan
operator ==atauoperator !=(CS0660). - Ambil alih Object.GetHashCode saat Anda menentukan
operator ==atauoperator !=(CS0661).
Mengesampingkan metode ini memastikan perilaku kesetaraan yang konsisten di berbagai API dan jenis koleksi.