我正在寻找一种方法来防范超出范围的争论,这些都是......
public static class Guard {
public static void AgainstOutOfRange<TArgument>(TArgument argument,
TArgument minInclusive, TArgument maxInclusive)
where TArgument : struct, IComparable<TArgument>, IConvertible
{
if(argument.CompareTo ????
}
寻找数字约束&#39;关于泛型,我在@ this {@}建议
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
return actual.CompareTo(comp) > 0;
}
但我不确定这是否具有包容性,排他性以及如何检查“IsSmallerThan&#39; (我还不完全理解IComparable
)
答案 0 :(得分:2)
Guard.AgainstOutOfRange(5, 0, 5)
应接受5
作为有效参数,因为我们允许0
5
包含。Guard.ArgumentOutOfRange(5, 0, 5)
应该拒绝5
作为有效参数,因为我们不允许上限和下限本身作为有效值。考虑到这一点,我认为您只是在寻找:
if(argument.CompareTo(minInclusive) < 0 ||
argument.CompareTo(maxInclusive) > 0)
{
throw new ArgumentException("Argument out of range");
}
我们在这里说:
argument
与minInclusive
进行比较的结果小于零(argument
小于minInclusive
)或argument
与maxInclusive
进行比较的结果是大于零(argument
大于maxInclusive
)...然后我们有一个无效的论点。请注意,如果在任何一种情况下比较等于为零,我们将其视为有效参数(零不大于或小于零,因此它通过了我们的测试)。
如果我们要进行测试独占,我们可以在检查中包含CompareTo
等于零的结果:
if(argument.CompareTo(minInclusive) <= 0 ||
argument.CompareTo(maxInclusive) >= 0)
{
throw new ArgumentException("Argument out of range");
}
然后我们说如果参数等于下限或上限,那也是一个无效的参数。
The documentation for IComparable.CompareTo
解释了instance.CompareTo(obj)
:
小于零此实例在排序顺序中位于obj之前。
零:此实例与obj在排序顺序中的位置相同。
大于零:此实例遵循排序顺序中的obj。