我遇到的问题可能是代码合同中的错误,或者我只是遗漏了一些东西。
我有一个带有可为空的DateTime属性DateValue
的类,它由构造函数设置。类的==重载表明如果first.DateValue == second.DateValue
,则2个对象相等。奇怪的是,这种比较导致代码合同警告:
布尔条件first.DateValue.HasValue始终求值为a 恒定价值。如果它(或它的否定)出现在源代码中,那么 可能有一些死代码或冗余检查
// 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);
}
// ...
}
我不明白为什么重写者会认为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 :(得分:1)
根据我的经验,这是代码合同中的错误。我在其他情况下遇到过它。看一下这个问题(和答案),它与您的问题性质相似:CodeContracts: Boolean condition evaluates to a constant value, why?