代码合约警告DateTime.HasValue始终求值为常量值

时间:2015-10-12 03:02:58

标签: c# .net code-contracts

我遇到的问题可能是代码合同中的错误,或者我只是遗漏了一些东西。

我有一个带有可为空的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());
    }
}

1 个答案:

答案 0 :(得分:1)

根据我的经验,这是代码合同中的错误。我在其他情况下遇到过它。看一下这个问题(和答案),它与您的问题性质相似:CodeContracts: Boolean condition evaluates to a constant value, why?