私は次の方法を持っています:
public static bool IsBetween<T>(this IComparable<T> value, T lowerBound, T upperBound)
where T : IComparable<T>
{
Contract.Requires<>(value != null);
Contract.Requires<>(lowerBound != null);
Contract.Requires<>(upperBound != null);
Contract.Requires<>(upperBound.CompareTo(lowerBound) >= 0);
return IsBetween(value, lowerBound, upperBound, InclusionOptions.None);
}
public static bool IsBetween<T>(this IComparable<T> value, T lowerBound, T upperBound,
InclusionOptions options) where T : IComparable<T>
{
Contract.Requires<>(value != null);
Contract.Requires<>(lowerBound != null);
Contract.Requires<>(upperBound != null);
Contract.Requires<>(upperBound.CompareTo(lowerBound) >= 0); //Code Contracts Issue
...
}
ここでの問題は、私の最後の要件が気に入らないことです。それは述べていますCodeContracts: requires unproven: upperBound.CompareTo(lowerBound) >= 0
。ここでこれを修正する適切な方法が本当にわかりません。比較値を実行するときに、実際に実際の lowerBound 値と upperBound 値があり、lowerBound 値が upperBound 値を超えていないことを確認する必要があります。
ああ、実際の < または > 演算子は使用できません。型 'T' には適用できないからです。
最後に、これは別の質問になる可能性があることは知っていますが、非常に関連しています...コード契約v1.4.50126.1を使用しているときにCA1062コード分析エラーが引き続き発生する理由を誰かが知っている場合は、修正する方法を教えてください:CA1062: Microsoft.Design : In externally visible method 'MyClass.IsBetween<T>(this IComparable<T>, T, T), validate parameter 'upperBound' before using it.