我已为这对CodeContracts论坛在MSDN,但显然没有人知道或困扰寻找到这个问题。
我试图减少重复性的断言,并使其更具重用性但不幸的是,这并不工作,你能解释一下为什么?
[ContractVerification(false)]
public static class Assert
{
[Conditional("DEBUG")]
public static void GreaterThan<T>(T value, T lowerBound) where T : IComparable<T>
{
Contract.Ensures(value.CompareTo(lowerBound) > 0);
}
[Conditional("DEBUG")]
public static void GreaterThanOrEqual<T>(T value, T lowerBound) where T : IComparable<T>
{
Contract.Ensures(value.CompareTo(lowerBound) >= 0);
}
[Conditional("DEBUG")]
public static void LessThan<T>(T value, T upperBound) where T : IComparable<T>
{
Contract.Ensures(value.CompareTo(upperBound) < 0);
}
[Conditional("DEBUG")]
public static void LessThanOrEqual<T>(T value, T upperBound) where T : IComparable<T>
{
Contract.Ensures(value.CompareTo(upperBound) <= 0);
}
[Conditional("DEBUG")]
public static void NotNull(object value)
{
Contract.Ensures(value != null);
}
[Conditional("DEBUG")]
public static void NotNullOrEmpty(string value)
{
Contract.Ensures(!string.IsNullOrEmpty(value));
}
[Conditional("DEBUG")]
public static void True(bool value)
{
Contract.Ensures(value);
}
[Conditional("DEBUG")]
public static void False(bool value)
{
Contract.Ensures(!value);
}
[Conditional("DEBUG")]
public static void InRange<T>(T value, T lowerBound, T upperBound, ExclusionMode exclusionMode = ExclusionMode.None) where T : IComparable<T>
{
Contract.Ensures(((exclusionMode | ExclusionMode.LowerBound) == ExclusionMode.LowerBound ? value.CompareTo(lowerBound) > 0 : value.CompareTo(lowerBound) >= 0) && ((exclusionMode | ExclusionMode.UpperBound) == ExclusionMode.UpperBound ? value.CompareTo(upperBound) < 0 : value.CompareTo(upperBound) <= 0));
}
}
我把它改成下面的,它似乎工作,但显然通用版本是更可取。
[ContractVerification(false)]
public static class Assert
{
[Conditional("DEBUG")]
public static void GreaterThan(int value, int lowerBound)
{
Contract.Ensures(value > lowerBound);
}
[Conditional("DEBUG")]
public static void GreaterThanOrEqual(int value, int lowerBound)
{
Contract.Ensures(value >= lowerBound);
}
[Conditional("DEBUG")]
public static void LessThan(int value, int upperBound)
{
Contract.Ensures(value < upperBound);
}
[Conditional("DEBUG")]
public static void LessThanOrEqual(int value, int upperBound)
{
Contract.Ensures(value <= upperBound);
}
[Conditional("DEBUG")]
public static void NotNull(object value)
{
Contract.Ensures(value != null);
}
[Conditional("DEBUG")]
public static void NotNullOrEmpty(string value)
{
Contract.Ensures(!string.IsNullOrEmpty(value));
}
[Conditional("DEBUG")]
public static void True(bool value)
{
Contract.Ensures(value);
}
[Conditional("DEBUG")]
public static void False(bool value)
{
Contract.Ensures(!value);
}
[Conditional("DEBUG")]
public static void InRange(int value, int lowerBound, int upperBound, ExclusionMode exclusionMode = ExclusionMode.None)
{
Contract.Ensures(((exclusionMode | ExclusionMode.LowerBound) == ExclusionMode.LowerBound ? value > lowerBound : value >= lowerBound) && ((exclusionMode | ExclusionMode.UpperBound) == ExclusionMode.UpperBound ? value < upperBound : value <= upperBound));
}
}
我只是想解释甚至没有一个解决方案,它具有CodeContracts没有直接的源代码,但在IL操作呢?