sty
13
2012

Gdy null nie jest nullem

Ostatnio spędziłem wiele czasu siedząc nad zdaje się prostym kawałkiem kodu:

 

var DTaccType = DTType as FlexCubeAccount;
var CTaccType = CTType as FlexCubeAccount;

if (DTaccType != null && CTaccType != null)
{
    Enums.DictionaryObject.ACCOUNTANCY_DEBIT_TYPE DTAccountType = DTaccType.GetAccountType();
    Enums.DictionaryObject.ACCOUNTANCY_DEBIT_TYPE CTAccountType = CTaccType.GetAccountType();
...

Po kompilacji i uruchomieniu wywaliło mi się z NullReferenceException który poleciał wewnątrz if-a. Ale jakim cudem ? Sprawdzam w debuggerze no i pokazuje jak byk że CTaccType jest nullem. To jakim cudem weszło do if-a ? A co ciekawsze sprawdzenie CTaccType != null daje true. Rozwiązanie problemu podpowiedział mi kolega przypominając o takim cudzie jak przeciążenie operatorów. Jakiś geniusz implementując klasę FlexCubeAccount przeciążył operator != w cudowny sposób:

public static bool operator !=(FlexCubeAccount fca, FlexCubeAccount fcb)
      {
         if( (object)fca != null && (object)fcb != null)
         {
            return fca.m_fcnNumber != fcb.m_fcnNumber;
         }
         return true;
      }

No i siedź sobie później człowieku i mów pod nosem "ale WTF ? jakim cudem ?" :)