【问题标题】:C# boxing enum error with generics带有泛型的 C# 拳击枚举错误
【发布时间】:2009-06-23 07:25:42
【问题描述】:

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

我遇到以下错误: 类型'TestApp.TestVal' 不能用作泛型类型或方法'TestApp.SomeClass<T>' 中的类型参数'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&lt;int&gt;接口,似乎不应该有错误......

【问题讨论】:

  • int 实现了 IComparable 但这并不意味着 RandomEnumType 实现了 IComparable

标签: c# generics enums icomparablet


【解决方案1】:

首先,我不确定将 IComparable&lt;T&gt; 与枚举一起使用是否明智...IEquatable&lt;T&gt;,当然 - 但是比较?

作为更安全的选择;与其使用通用约束来强制使用IComparable&lt;T&gt;,不如在类中使用Comparer&lt;T&gt;.Default。这具有支持IComparable&lt;T&gt;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

【讨论】:

  • 感谢您为我的问题提供可能的替代解决方案。实际代码在测试框架中非常深入,需要处理几乎任何类型的测试数据。我将不得不做更多调查,但您的代码似乎是处理我的通用对象中比较的更好方法....
【解决方案2】:

枚举不是从 System.Int32s 派生的 - 它们是从 System.Enum 派生的,它没有实现 IComparable&lt;int&gt;(但它确实实现了 IComparable)。

虽然枚举的基础值默认是 int,但枚举本身不是。因此,两者之间没有转换。

【讨论】:

  • (我修复了降价 - 然后发疯了并编辑了您的答案而不是我自己的答案!现在已修复;对此感到抱歉......)
  • 感谢您的解释。这有帮助。这也让我想知道我是否会对结构有同样的问题....
【解决方案3】:

枚举没有实现IComparable&lt;T&gt;,但它确实实现了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);
    }
}

【讨论】:

    【解决方案4】:

    在 C# 枚举中实现 IComparable,但不是通用的 IComparable&lt;T&gt;。我不确定这是为什么,但也许您可以在 where 子句中切换到非通用 IComparable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多