Belgelerine göre ==
operatör MSDN ,
Önceden tanımlanmış değer türleri için, işlenenlerinin değerleri eşitse eşitlik operatörü (==) true değerini, aksi takdirde false değerini döndürür. Dize dışındaki başvuru türleri için, iki işleneni aynı nesneye başvuruyorsa == true değerini döndürür. Dize türü için ==, dizelerin değerlerini karşılaştırır. Kullanıcı tanımlı değer türleri == operatörünü aşırı yükleyebilir (operatöre bakın). Varsayılan olarak == yukarıda tanımlanmış ve kullanıcı tanımlı referans türleri için yukarıda açıklandığı gibi davranmasına rağmen , kullanıcı tanımlı referans türleri de kullanılabilir.
Peki bu kod pasajı neden derlenemiyor?
bool Compare<T>(T x, T y) { return x == y; }
'==' İşleci 'T' ve 'T' tipi işlenenlere uygulanamıyor hatasını alıyorum . Acaba neden anladığım kadarıyla ==
operatör tüm tipler için önceden tanımlanmış?
Düzenleme: Herkese teşekkürler. İlk başta ifadenin sadece referans türleriyle ilgili olduğunu fark etmedim. Ayrıca, artık doğru olmadığını bildiğim tüm değer türleri için bit-bit karşılaştırmasının sağlandığını düşündüm .
Ancak, bir referans türü ==
kullanmam durumunda , operatör önceden tanımlanmış referans karşılaştırmasını kullanır mı yoksa bir tür tanımlıysa, operatörün aşırı yüklenmiş sürümünü kullanır mı?
Düzenleme 2: Deneme yanılma yoluyla, ==
operatörün sınırsız bir genel tip kullanırken önceden tanımlanmış referans karşılaştırmasını kullanacağını öğrendik . Aslında, derleyici kısıtlı tür argümanı için bulabileceği en iyi yöntemi kullanacaktır, ancak daha fazla bakmayacaktır. Örneğin, aşağıdaki kod çağrılsa true
bile her zaman yazdırılır Test.test<B>(new B(), new B())
:
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); } }
==
, aynı tipteki iki işlenen arasında buna izin verilmeyen bazı türlerin olduğunu anlamak yararlı olabilir . Bu, struct
aşırı yüklenmeyen türler için ("önceden tanımlanmış" türler hariç) geçerlidir operator ==
. Basit bir örnek olarak, şunu deneyin:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
o zaman kontrol edemez, kvp1 == kvp2
çünkü KeyValuePair<,>
bu bir C # önceden tanımlanmış türü değil, bir yapı olduğunu ve aşırı değildir operator ==
. Yine var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
de yapamayacağınız bir örnek verilir e1 == e2
(burada aşırı yüklenmeyen iç içe yapı List<>.Enumerator
( "List`1+Enumerator[T]"
çalışma zamanı tarafından çağrılır ) var ==
).
bool
bir mesafede void
...