SORU
24 Aralık 2008, ÇARŞAMBA


't operatörü == C genel türler için uygulanabilir#?

MSDN == operatör belgelerine göre

Ön tanımlı değer tipleri, için eşitlik operatörü (==) true döndürür onun işlenen değerlerinin eşit olması, aksi halde yanlış. Başvuru türleri için dize dışında, == true döndürür iki işlenen aynı bakın nesne. String türü için, == karşılaştırır dizeleri değerleri. Kullanıcı tanımlı değer tipleri aşırı == operatörü (operatör). Bu yüzden kullanıcı tanımlı referans tipleri, ancak == açıklandığı gibi davranır varsayılan olarak hem önceden tanımlanmış için yukarıda ve kullanıcı tanımlı referans tipleri.

Neden bu kod parçacığını derlemek için başarısız mı?

void Compare<T>(T x, T y) { return x == y; }

Hatası alıyorum'==' Cannot tür işlenen uygulanan '' ve '' . T T operatörü . , Anladığım kadarıyla beri == operatör tüm türleri için önceden neden acaba?

Düzenleme:Teşekkürler herkese. Deyimi hakkında yalnızca başvuru türleri olduğunu ilk başta fark etmedim. Ben de bit bit karşılaştırma ben şimdi biliyorum ki tüm değer türleri için sağlanan düşündümdeğildoğru.

Ancak, bir başvuru türü kullanıyorum, == operatör, önceden tanımlanmış referans karşılaştırma kullanmak istiyorsunuz, yoksa bir tür. eğer operatör aşırı yüklenmiş sürümünü kullanmak istiyorsunuz?

Edit 2:Deneme yanılma yoluyla, == operatör sınırsız genel bir tür kullanırken, önceden tanımlanmış referans karşılaştırma kullanacağını öğrendik. Aslında, derleyici yasak türü bağımsız değişkeni için bulabilirsiniz, ama daha fazla bakmak iyi bir yöntem kullanacak. Örneğin, aşağıdaki kod, her zaman Test.test<B>(new B(), new B()) ona true yazdırma:

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); } }

CEVAP
24 Aralık 2008, ÇARŞAMBA


Herkesin dediği gibi, sadece T bir başvuru türü için kısıtlı olduğunda işe yarayacak. Herhangi bir kısıtlama olmaksızın, null ile karşılaştırabilirsiniz, ama sadece boş ve bu karşılaştırma her zaman null olmayan bir değer türü için yanlış olacaktır.

Eşittir demek yerine, daha iyi IComparer<T> - ve eğer daha fazla bilgi varsa, EqualityComparer<T>.Default iyi bir seçimdir kullanımı:

public bool Compare<T>(T x, T y)
{
    return EqualityComparer<T>.Default.Equals(x, y);
}

Her şey bir yana, bu/döküm boks önler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bobbylee Budde

    Bobbylee Bud

    13 ŞUBAT 2011
  • Canceriansoul

    Canceriansou

    15 Ocak 2011
  • The Slow Mo Guys

    The Slow Mo

    15 AĞUSTOS 2010