防止出现超出范围的论点
本文关键字:范围 | 更新日期: 2023-09-27 18:25:48
我正在寻找一种方法来防止参数超出范围,类似于。。。
public static class Guard {
public static void AgainstOutOfRange<TArgument>(TArgument argument,
TArgument minInclusive, TArgument maxInclusive)
where TArgument : struct, IComparable<TArgument>, IConvertible
{
if(argument.CompareTo ????
}
在寻找泛型的"数字约束"时,@Lee建议
public static bool IsGreaterThan<T>(this T actual, T comp) where T : IComparable<T>
{
return actual.CompareTo(comp) > 0;
}
然而,我不确定这是否是包容性的、排他性的,以及如何检查"IsSmallerThan"(我还不完全理解IComparable
)
-
Inclusive意味着我们将把下限和上限作为有效值包括在内。例如,
Guard.AgainstOutOfRange(5, 0, 5)
应该接受5
作为有效参数,因为我们允许0
到5
包含 -
Exclusive意味着我们将排除下限和上限。例如,
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");
}
然后我们会说如果参数等于下限或上限,那也是一个无效的参数
IComparable.CompareTo
的文档解释了instance.CompareTo(obj)
:的结果
小于零此实例在排序顺序中位于obj之前。
零:此实例出现在排序顺序中与obj相同的位置。
大于零:此实例按排序顺序跟在obj后面。