我正在尝试验证此课程:min >= max
。我意识到使用泛型我不能使用比较器。
这是我的通用课程。
public class Range<T>
{
public T MinValue { get; set; }
public T MaxValue { get; set; }
public Range() { }
public Range(T min, T max)
{
this.MinValue = min;
this.MaxValue = max;
}
public override bool Equals(object obj)
{
if (obj == null) return false;
var other = obj as Range<T>;
return this.MinValue.Equals(other.MinValue) &&
this.MaxValue.Equals(other.MaxValue);
}
public override string ToString()
{
return string.Format("{0},{1}", this.MinValue, this.MaxValue);
}
}
T数据类型只能是数字,有没有办法只接受数字并接受<=
?
答案 0 :(得分:11)
不,您不能将通用符号限制为数字,但您可以将T
约束为IComparable<T>
,然后使用CompareTo()
public class Range<T> where T : IComparable<T>
{
....
}
然后你可以说:
if (min.CompareTo(max) >= 0)...
抛出验证异常或您想要的任何验证。您可以使用相同的东西来确保值为&gt; = min和&lt; = max。
if (value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0)...
答案 1 :(得分:1)
public class Range<T> where T : IComparable<T>
{
...
public bool Check(T value)
{
return value.CompareTo(min) >= 0 && value.CompareTo(max) <= 0;
}
}
如果您的范围在0到10之间,并希望0到10失败(排除最小和最大) - 只需将“&gt; =”替换为“&gt;”和“&lt; =”与“&lt;”。
我还建议更改等号覆盖:
return this.MinValue.Equals(other.MinValue) &&
this.MaxValue.Equals(other.MaxValue);
到此:
return this.MinValue.CompareTo(other.MinValue) == 0 &&
this.MaxValue.CompareTo(other.MaxValue) == 0;