无法比较泛型值

本文关键字:泛型 比较 | 更新日期: 2023-09-27 17:56:56

如果我运行这段代码,怎么会来:

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>,因为这不是主要问题

无法比较泛型值

您应该对 TEnum 类型进行约束。写"=="是什么意思?参考等于?相等。成员平等?

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

Get() 函数有两个问题:

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

你可以试试

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));
} 

但是,这是危险的领域,绝不是类型安全的。

我会更改 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);
        }
    }