gpt4 book ai didi

c# - 与 IComparable 一起使用的可空泛型类型。可能吗?

转载 作者:可可西里 更新时间:2023-11-01 08:58:45 25 4
gpt4 key购买 nike

我正在尝试创建一个简单的 Clamp(以便我可以绑定(bind)任何可比较的值......主要用于数字类型,如 int、double 等)

问题是如果我执行以下操作会出现错误,但是 according to MSDN IComparable 的 CompareTo 应该能够处理空值。
引述:“根据定义,任何对象比较大于 null,并且两个 null 引用相互比较相等。”

public static T Clamp<T>(this T value, T min, T max)
where T : IComparable<T>
{
if (value.CompareTo(max) > 0)
return max;

if (value.CompareTo(min) < 0)
return min;

return value;
}



private Int32? _zip;
public Int32? Zip
{
get
{
return _zip;
}
set
{
_zip = value.Clamp<Int32?>(0, 99999);
}
}

最佳答案

正如@LBushkin 所说,Nullable< T > 还是 T?不实现 IComparable 接口(interface)。给定的解决方案是可以的,但是我更喜欢在一个专门的类中使用可为空的比较逻辑,遵循 Single Responsibility Principle。 , 也可以用于比较任何 Nullable 类型。

例如,您可以像这样创建一个通用的 Nullable 类型比较器类:

public class NullableComparer<T> : IComparer<Nullable<T>>
where T : struct, IComparable<T>
{

public int Compare(Nullable<T> x, Nullable<T> y)
{
//Compare nulls acording MSDN specification

//Two nulls are equal
if (!x.HasValue && !y.HasValue)
return 0;

//Any object is greater than null
if (x.HasValue && !y.HasValue)
return 1;

if (y.HasValue && !x.HasValue)
return -1;

//Otherwise compare the two values
return x.Value.CompareTo(y.Value);
}

}

在这种情况下,您将像这样使用此类:

public static T? Clamp<T>(this T? value, T? min, T? max)
where T : struct
{
var comparer = new NullableComparer<T>();

if (comparer.Compare(value, max) > 0)
return max;

if (comparer.Compare(value, min) < 0)
return min;

return value;
}

方便保存在您的助手库中。

希望对您有所帮助!

关于c# - 与 IComparable 一起使用的可空泛型类型。可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3294575/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com