我不明白这里发生了什么...

我遇到以下错误:
不能在通用类型或方法'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/

10-12 05:11