无法比较通用值

时间:2011-05-20 08:41:09

标签: c# linq generics

如果我运行此代码怎么办:

namespace TestCode
{
    public class EnumList<TEnum>
    {
        private IList<TEnum> _list;


        public EnumList()
        {
            _list = new List<TEnum>();
        }

        public void Add(TEnum val)
        {
            _list.Add(val);
        }

        public int Get(TEnum val)
        {
            return (int)(from one in _list
                         where one == val
                         select one).First();
        }
    }
}

给我一​​个错误,无法将类型TEnum转换为类型TestCode.TEnum?

(顺便说一句,这是'释义',因为我的实际代码在家里而且我正在工作)

编辑:从构造函数中删除<TEnum>,因为这不是主要问题

4 个答案:

答案 0 :(得分:1)

您应该在TEnum类型上加constraint。写“==”时你是什么意思?的ReferenceEquals? IComparable.Equals?成员等于?

答案 1 :(得分:0)

在构造函数中省略<TEnum>部分,因为在这种情况下,它认为您可以在构造函数和类本身上分配不同的TEnum。有趣的是,它并没有抱怨两者都有相同的名称。

答案 2 :(得分:0)

Get() - 函数存在两个问题:

  1. one == val不是有效语句,因为TEnum未绑定。尝试使用Equals(one,val)代替(我假设TEnum将是枚举类型)
  2. 将结果转换为int无效,因为无法知道是否存在从TEnum到int的转换。
  3. 你可以尝试

    public int Get(TEnum val)
    {            
        var result = (from one in _list
                     where Equals(one, val)
                     select one).First();
        return (Int32) Convert.ChangeType(result, typeof(Int32));
    } 
    

    然而,这是一个危险的领域,不会是类型安全的。

答案 3 :(得分:0)

我会改变Get方法的返回类型,然后你可以将结果转换为int:

    public class EnumList<TEnum> where TEnum:struct, IComparable
    {
        private IList<TEnum> _list;

        public EnumList()
        {
            _list = new List<TEnum>();
        }

        public void Add(TEnum val)
        {
            _list.Add(val);
        }

        public TEnum Get(TEnum val)
        {
            return _list.Single(l => l.CompareTo(val) == 0);
        }
    }

    public class MyClass
    {
        public void MyMethod()
        {
            var list = new EnumList<DayOfWeek>();
            var value = (int)list.Get(DayOfWeek.Wednesday);
        }
    }