防止出现超出范围的论点

本文关键字:范围 | 更新日期: 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作为有效参数,因为我们允许05包含
  • Exclusive意味着我们将排除下限和上限。例如,Guard.ArgumentOutOfRange(5, 0, 5)应该拒绝将5作为有效参数,因为我们不允许将上界和下界本身作为有效值

考虑到这一点,我认为你只是在寻找:

if(argument.CompareTo(minInclusive) < 0 ||
    argument.CompareTo(maxInclusive) > 0)
{
    throw new ArgumentException("Argument out of range");
}

我们要说的是:

  • 如果比较argumentminInclusive的结果小于零argument小于minInclusive)或
  • 比较argumentmaxInclusive的结果是大于零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后面。