Menurut dokumentasi ==
operator di MSDN ,
Untuk tipe nilai yang telah ditentukan, operator persamaan (==) mengembalikan true jika nilai operandnya sama, salah jika tidak. Untuk tipe referensi selain string, == mengembalikan true jika kedua operandnya merujuk ke objek yang sama. Untuk tipe string, == membandingkan nilai string. Jenis nilai yang ditentukan pengguna dapat membebani operator == (lihat operator). Demikian juga tipe referensi yang ditentukan pengguna, meskipun secara default == berperilaku seperti yang dijelaskan di atas untuk tipe referensi yang ditentukan sebelumnya dan yang ditentukan pengguna.
Jadi mengapa cuplikan kode ini gagal dikompilasi?
bool Compare<T>(T x, T y) { return x == y; }
Saya mendapatkan kesalahan Operator '==' tidak dapat diterapkan ke operan tipe 'T' dan 'T' . Saya bertanya-tanya mengapa, karena sejauh yang saya mengerti ==
operator sudah ditentukan untuk semua jenis?
Sunting: Terima kasih, semuanya. Awalnya saya tidak memperhatikan bahwa pernyataan itu hanya tentang tipe referensi. Saya juga berpikir bahwa perbandingan sedikit demi sedikit disediakan untuk semua tipe nilai, yang sekarang saya tahu tidak benar.
Tetapi, jika saya menggunakan tipe referensi, apakah ==
operator akan menggunakan perbandingan referensi yang sudah ditentukan sebelumnya, atau akankah menggunakan versi overload dari operator jika suatu tipe didefinisikan?
Sunting 2: Melalui percobaan dan kesalahan, kami mengetahui bahwa ==
operator akan menggunakan perbandingan referensi yang telah ditentukan saat menggunakan jenis generik yang tidak dibatasi. Sebenarnya, kompiler akan menggunakan metode terbaik yang dapat ditemukan untuk argumen tipe terbatas, tetapi tidak akan mencari lagi. Misalnya, kode di bawah ini akan selalu dicetak true
, bahkan ketika Test.test<B>(new B(), new B())
dipanggil:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
tidak diizinkan antara dua operan dari jenis yang sama. Ini berlaku untuk struct
tipe (kecuali tipe "yang ditentukan") yang tidak membebani operator ==
. Sebagai contoh sederhana, coba ini:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, maka Anda tidak dapat memeriksa kvp1 == kvp2
karena KeyValuePair<,>
merupakan sebuah struct, itu bukan tipe yang ditentukan # C, dan itu tidak membebani operator ==
. Namun contoh diberikan var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
dengan mana Anda tidak dapat melakukan e1 == e2
(di sini kami memiliki struct bersarang List<>.Enumerator
(disebut "List`1+Enumerator[T]"
dengan runtime) yang tidak kelebihan beban ==
).
bool
dari void
...