如果我运行此代码怎么办:
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>
,因为这不是主要问题
答案 0 :(得分:1)
您应该在TEnum类型上加constraint。写“==”时你是什么意思?的ReferenceEquals? IComparable.Equals?成员等于?
答案 1 :(得分:0)
在构造函数中省略<TEnum>
部分,因为在这种情况下,它认为您可以在构造函数和类本身上分配不同的TEnum。有趣的是,它并没有抱怨两者都有相同的名称。
答案 2 :(得分:0)
Get() - 函数存在两个问题:
你可以尝试
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);
}
}