2015-05-13 32 views
8

Aşağıdaki C# snippet'inde == yöntemini geçersiz kıldım. _type, short türünde bir sayıdır. Yani ben aslında bu iki short s aynı olduğunda iki WorkUnitType s aynı olduğunu söylüyorum.== geçersiz kılma == geçersiz kılma

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

R # beni uyarıyor ve yukarıda if deyimi ile o yakalamaya çalışıyorum, neden/type2type1 potansiyel boş olabileceğini tamamen açık olduğu için.

Şimdi tamamen anlamsız olan bir StackOverflowException alıyorum çünkü aslında geçersiz kılma çağırıyorum.

Soru: Bu yöntemi nasıl "doğru" yazarım. type1 veya type2'un null olması durumu nasıl yakalayabilirim?

En iyi tahminle: Belki burada == kötüye kullanımı ve eşitlik için kontrol ediyorum Equals geçersiz kılma ile yapılmalıdır. Ama yine de sorunun var olduğunu düşünüyorum. Peki benim mantığımdaki hatam nerede?

cevap

9

Doğrudan operatörünüzün aşırı yüklenmesini karşılaştıracak olan ReferenceEquals() işlevini arıyorsunuz.

+0

ben 'ReferenceEquals' var olduğunu bilmiyordum. Bu aslında cevaptır. Teşekkürler. – Stephan

2

SLaks'in söylediklerine ek olarak, her ikisi de null değerine eşitse, doğru olarak dönmek isteyebilirsiniz. Yani, bunun gibi: tamlık hatırına

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

: Ayrıca object için iki argüman yayınlayabilirsiniz. Bu, uygulamayı object'da tanımlandığı gibi kullanır ve sizin özel öğenizi değil. kodunda

:

if ((object) type1 == null || (object) type2 == null)