public override bool Equals(object obj)
        {
            if (obj == null || obj.GetType() != GetType())
            {
                return(false);
            }

            TValueObject         other       = (TValueObject)obj;
            IEnumerator <object> thisValues  = GetAtomicValues().GetEnumerator();
            IEnumerator <object> otherValues = other.GetAtomicValues().GetEnumerator();

            while (thisValues.MoveNext() && otherValues.MoveNext())
            {
                if (ReferenceEquals(thisValues.Current, null) ^
                    ReferenceEquals(otherValues.Current, null))
                {
                    return(false);
                }

                if (thisValues.Current != null &&
                    !thisValues.Current.Equals(otherValues.Current))
                {
                    return(false);
                }
            }
            return(!thisValues.MoveNext() && !otherValues.MoveNext());
        }
 protected static bool EqualOperator(TValueObject left, TValueObject right)
 {
     if (ReferenceEquals(left, null) ^ ReferenceEquals(right, null))
     {
         return(false);
     }
     return(ReferenceEquals(left, null) || left.Equals(right));
 }
 protected static bool NotEqualOperator(TValueObject left, TValueObject right)
 {
     return(!(EqualOperator(left, right)));
 }