日期:2014-05-17  浏览次数:21235 次

能否限定泛型参数必须是enum?泛型参数是enum时,怎么做枚举对象的==操作?
下边的两种比较方式都会提示运算符“==”无法应用于“T”和“T”类型的操作数
加了where T:struct 或 where T:enum也不行(后一种语法就不对)
问题如题。。。


    enum MyEnum
    {
    }

    class MyClass<T> 
    {
        T value;

        public bool EqualTo(T obj)
        {
            return (T)value == (T)obj;  //error
            return value == obj;   //error
            //强制转换成int也不行,用object.Equals的结果又不是我想要的。。。
        }
    }



------解决方案--------------------
你如果是要避免装箱拆箱,可以使用这个方法:
return Comparer<T>.Default.Compare(value, obj) == 0;
不过个人认为这里面装箱拆箱的性能损失是可以忽略的。

最后吐槽下3楼,基础不够扎实,虽然枚举有个Enum类型是class,但是枚举值本身是值类型,非引用类型,因此限定struct。而事实上IL层面上对枚举值的转换处理也只有装箱拆箱动作,完全符合值类型的说法。