我不明白这里发生了什么...
我遇到以下错误:
不能在通用类型或方法'TestApp.TestVal'
中将'T'
类型用作类型参数'TestApp.SomeClass<T>'
。没有从'TestApp.TestVal'
到'System.IComparable<TestApp.TestVal>'
的装箱转换。
以下代码会发生此错误:
public enum TestVal
{
First,
Second,
Third
}
public class SomeClass<T>
where T : IComparable<T>
{
public T Stored
{
get
{
return storedval;
}
set
{
storedval = value;
}
}
private T storedval;
}
class Program
{
static void Main(string[] args)
{
//Error is on the next line
SomeClass<TestVal> t = new SomeClass<TestVal>();
}
}
由于默认情况下枚举是
int
,而int则实现了IComparable<int>
接口(interface),因此似乎应该没有错误...。 最佳答案
首先,我不确定使用带枚举的IComparable<T>
是否明智... IEquatable<T>
,当然-但是比较吗?
作为更安全的选择;而不是使用通用约束来强制IComparable<T>
,也许可以在类内部使用Comparer<T>.Default
。这具有支持IComparable<T>
和IComparable
的优势-这意味着您传播的约束较少。
例如:
public class SomeClass<T> { // note no constraint
public int ExampleCompareTo(T other) {
return Comparer<T>.Default.Compare(Stored, other);
}
... [snip]
}
这对枚举很好用:
SomeClass<TestVal> t = new SomeClass<TestVal>();
t.Stored = TestVal.First;
int i = t.ExampleCompareTo(TestVal.Second); // -1
关于c# - 泛型C#装箱枚举错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1031079/