代码之家  ›  专栏  ›  技术社区  ›  jheddings

使用特定于类型的值初始化C#泛型

  •  3
  • jheddings  · 技术社区  · 16 年前

    在以下班级:

    public class Example<T> where T : IComparable {
        private T _min;
        private T _max;
    
        public Example() {
            // _min = T.MinValue;
            // _max = T.MaxValue;
        }
    
        public Example(T min, T max) {
            _min = min;
            _max = max;
        }
    
        public bool Contains(T val) {
            return (val.CompareTo(_min) < 0) && (val.CompareTo(_max) > 0);
        }
    }
    

    此外,如果一个类型支持无限值,例如float或double,是否有方法检测并相应地设置值?

    5 回复  |  直到 16 年前
        1
  •  9
  •   itowlson    16 年前

    没有任何约束允许您获取MinValue和MaxValue。以强类型化的方式可以获得的唯一值是default(default(T))。

    另一种解决方案是稍微重新设计类:添加_isMinSpecified和_isMaxSpecified布尔成员,并在Contains方法中查阅这些成员——例如,如果既没有指定最小值也没有指定最大值,则始终返回true。

        2
  •  0
  •   Ed Swangren    16 年前

    嗯,我认为没有现成的界面可以帮助你。每种具体类型(Int32、float等)都定义了自己的最小值和最大值,它们没有类似的通用接口。当然,您可以自己定义一个包装器类来实现这一点,但是这样就没有理由使用泛型:)

    此外,如果一个类型支持无限值,例如float或double,是否有方法检测并相应地设置值?

    就计算机而言,不存在“无限值”这样的东西,浮点数也不比比特更“无限”(它们只是拥有更多)。

        3
  •  0
  •   Thomas Levesque    16 年前

        4
  •  0
  •   Sean Vikoren    11 年前

    如果您使用的是C#3.5,下面是一个使用反射解决此问题的示例:

    public static class GenericLimit<T>
    {
        public static readonly T MinValue = (T)MinValue.GetType ().GetField ("MinValue").GetValue (MinValue);
        public static readonly T MaxValue = (T)MaxValue.GetType ().GetField ("MaxValue").GetValue (MaxValue);
    }
    
    public class MinMax<T> where T : struct
    {
        private readonly T minValue = GenericLimit<T>.MinValue;
        private readonly T maxValue = GenericLimit<T>.MaxValue;
    
        public T Min { get; private set; }
        public T Max { get; private set; }
    
        public static bool InRange (T value, T min, T max)
        {
            return (Operator.GreaterThanOrEqual (value, min) && Operator.LessThanOrEqual (value, max));
        }
    
        public MinMax () { Reset (); }
    
        public void Update (T n)
        {
            if (Operator.LessThan (n, Min)) Min = n;
            if (Operator.GreaterThan (n, Max)) Max = n;
        }
    
        public void Reset ()
        {
            Min = maxValue;
            Max = minValue;
        }
    }
    

    通用数学来自 C# in Depths to

    PS任何简化反射的建议都将不胜感激。

        5
  •  -1
  •   XXXXX    16 年前
    public Example() {
        _min = default (T);
        _max = default (T);
    }
    

    对不起,那不是你要找的。