У меня есть класс, который позволяет мне устанавливать значение с минимальными и максимальными пределами. Если эти пределы превышены, значение изменяется. До сих пор я использовал только двойной тип данных, но я также хочу использовать целые числа. Я надеялся, что общий класс даст правильное решение, но я бегу в некоторых проблем ....Ошибка распаковки общего класса
/// <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;
}
}
Во время настройки Т Value Я хотел бы ограничить на основе типа данных. Однако приведение к правильному типу данных дает мне проблему? Честно говоря, я довольно новичок в дженериках.
Любой, у кого есть рекомендации или лучший подход к тому, как это решить?
возможно * _value = (T) (объект) temp.ConstrainDouble ((double) (объект) Min, (double) (object) Max); * работает? – Gusman
Возможно, вы должны просто сделать код полностью универсальным. Ограничьте 'T' на' IComparable 'и используйте' CompareTo' для сравнения вместо операторов. –
Объяснение ошибки - http://stackoverflow.com/questions/17280547/why-can-i-not-modify-the-result-of-an-unboxing-conversion –