6

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

我收到以下错误: 该类型'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>(); 
    }
}

由于 enumint默认是一个并且 int 实现了IComparable<int>接口,因此似乎不应该有错误....

4

4 回答 4

9

IComparable<T>首先,我不确定与 enum...一起使用是否明智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
于 2009-06-23T07:38:13.737 回答
5

枚举不是从 System.Int32s 派生的——它们是从 System.Enum 派生的,后者没有实现IComparable<int>(但它确实实现IComparable了)。

尽管默认情况下枚举的基础值是 int,但枚举本身不是。因此,两者之间没有转换。

于 2009-06-23T07:36:23.880 回答
1

枚举没有实现IComparable<T>,但它确实实现了IComparable。因此,枚举可以是 where 子句中的 T,例如:

    where T : IComparable

但这给出了一个错误:

    where T : IComparable<T>

然后我想您希望 SomeClass 具有可比性。为此,它必须自己实现 IComparable。

这是两者的示例(使用公共成员保持代码简单):

public class SomeClass<T>
    : IComparable<SomeClass<T>>
    where T : IComparable
{
    public T storedval;

    public int CompareTo(SomeClass<T> other)
    {
        return storedval.CompareTo(other.storedval);
    }
}
于 2009-06-23T08:45:18.470 回答
0

在 C# 枚举中实现IComparable,但不是泛型IComparable<T>。我不确定为什么会这样,但也许你可以IComparable在 where 子句中切换到非泛型。

于 2009-06-23T07:32:47.087 回答