无法比较泛型值
本文关键字:泛型 比较 | 更新日期: 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() 函数有两个问题:
- 一个 == val 不是有效的语句,因为 TEnum 没有绑定。尝试使用 Equals(one, val) 代替(我假设 TEnum 将是一个枚举类型)
- 将结果转换为 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);
}
}