泛型类取消装箱错误

本文关键字:错误 取消装箱 泛型类 | 更新日期: 2023-09-27 18:36:37

我有一个类,允许我设置最小和最大限制的值。如果超过这些限制,则会修改该值。到目前为止,我只使用双精度数据类型,但我也想使用整数。我希望泛型类能给出正确的解决方案,但我遇到了一些问题......

/// <summary>
/// This method takes a default value with the min and max limits. If the value exceeds these limits it is corrected.
/// </summary>
public partial class GeneratorProperty<T>
{
    private T _value;
    private T Min { get; }
    private T Max { get; }
    /// <summary>
    /// </summary>
    /// <param name="defaultValue"></param>
    /// <param name="min"></param>
    /// <param name="max"></param>
    public GeneratorProperty(T defaultValue, T min, T max)
    {
        _value = defaultValue;
        Min = min;
        Max = max;
    }
    /// <summary>
    /// </summary>
    public T Value
    {
        get { return _value; }
        set
        {
            if (typeof (T) == typeof (double))
            {
                var temp = (double)(object)value;
                (double)(object)_value = temp.ConstrainDouble((double)(object)Min, (double)(object)Max);
                //Cannot modify the result of an unboxing conversion
            }
            else if (typeof(T) == typeof(int))
            {
                var temp = (int)(object)value;
                (int)(object)_value = temp.ConstrainInt((int)(object)Min, (int)(object)Max);
                //Cannot modify the result of an unboxing conversion
            }
        }
    }
}
/// <summary>
/// </summary>
public static class Extention
{
    /// <summary>
    ///     The extension method Constrains a double using a min and max value.
    /// </summary>
    /// <param name="value">Value to test</param>
    /// <param name="min">minimum limit</param>
    /// <param name="max">maximum limit</param>
    /// <returns></returns>
    public static double ConstrainDouble(this double value, double min, double max)
    {
        if (value >= min && value <= max)
            return value;
        if (value >= max)
            return max;
        if (value <= min)
            return min;
        return 1;
    }
    public static double ConstrainInt(this int value, int min, int max)
    {
        if (value >= min && value <= max)
            return value;
        if (value >= max)
            return max;
        if (value <= min)
            return min;
        return 1;
    }
}

在设置T值期间,我想根据数据类型进行约束。但是,转换为正确的数据类型会给我带来问题?老实说,我对泛型很陌生。

有人对如何解决这个问题有一些建议或更好的方法吗?

泛型类取消装箱错误

任何时候你对泛型类型进行特定的类型检查(即如果(typeof(T) == typeof(double)))你可能做错了什么。

public partial class GeneratorProperty<T> where T: IComparable<T>
{
    ...
    public T Value
    {
        get {... }
        set 
        {
            if (this.Max.CompareTo(value) < 0)
                this._value = this.Max;
            else if (this.Min.CompareTo(value) > 0)
                this._value = this.Min;
            else
                this._value = value;
        }
    }
}

泛型的主要目的之一是避免关心您实际接收和操作的类型。约束通过指定类型中必须具有的部分才能使其正常工作来帮助缩小范围。

在这种情况下,您希望能够比较它们,因此请在约束中强制执行。