2015-10-12 2 views
1

У меня проблема, которая может быть ошибкой в ​​контрактах с кодом или я просто что-то пропустил.Предупреждение о заключении контрактов по дате DateTime.HasValue всегда принимает значение

У меня есть класс с нулевым значением DateTime DateValue, который устанавливается конструктором. Перегрузка класса == утверждает, что 2 объекта равны, если first.DateValue == second.DateValue. Как ни странно, это сравнение вызывает предупреждение Код контракта:

Логическое условие first.DateValue.HasValue всегда оценивает в постоянное значение. Если он (или его отрицание) появляются в исходном коде, вы может иметь некоторый мертвый код или избыточные проверки

// relevant code only. full code posted later 
public class ClassWithDate 
{ 
    public DateTime? DateValue { get; private set; } 

    public ClassWithDate(DateTime? dateValue) 
    { 
     DateValue = dateValue; 
    } 

    public static bool operator ==(ClassWithDate first, ClassWithDate second) 
    { 
     // ... 

     // !! CODE CONTRACT WARNING HERE !! 
     return (first.DateValue == second.DateValue); 
    } 

    // ... 
} 

Я не понимаю, почему ReWriter будет думать, что DateValue.HasValue всегда является постоянной величиной, а также то, что он имеет отношение к равенству DateTime.

Я пропустил что-то с кодовыми контрактами? Или с перегрузками равенства? Может ли это быть ошибкой в ​​кодовых контрактах?

Полный код ниже.

public class ClassWithDate 
{ 
    public DateTime? DateValue { get; private set; } 

    public ClassWithDate(DateTime? dateValue) 
    { 
     DateValue = dateValue; 
    } 

    public override bool Equals(object obj) 
    { 
     return ((obj as ClassWithDate) != null) && (this == (ClassWithDate)obj); 
    } 

    public static bool operator ==(ClassWithDate first, ClassWithDate second) 
    { 
     if (object.ReferenceEquals(first, second)) return true; 
     if (((object)first == null) || ((object)second == null)) return false; 

     // compare dates 
     return (first.DateValue == second.DateValue); 
    } 

    public static bool operator !=(ClassWithDate first, ClassWithDate second) 
    { 
     return !(first == second); 
    } 

    public override int GetHashCode() 
    { 
     return (DateValue == null ? 0 : DateValue.GetHashCode()); 
    } 
} 
+0

DateTime - это не объект, а тип объекта. – Hogan

+0

Huh. Честно говоря, это головоломка для меня. Мне будет интересно увидеть решение. – BHustus

+0

Если это тип значения, значение всегда будет истинным. Я не выглядел так тяжело в исходном источнике, но нулевое datetime не имеет смысла. Вероятно, просто установите значение равным нулю ... Это по-прежнему является юридическим значением для даты и времени, поэтому предупреждение действительно. – Hogan

ответ

1

Из моего опыта это ошибка в кодовых контрактах. Я столкнулся с этим в других ситуациях. Взгляните на этот вопрос (и ответы), который по своему характеру похож на вашу проблему: CodeContracts: Boolean condition evaluates to a constant value, why?

+0

Чтобы обойти эту ошибку, я решил проигнорировать ошибку, используя атрибут «ContractVerification» для этого ответ: http://stackoverflow.com/a/3662612/65775 – Keith

Смежные вопросы