.NET 3.5 - 对象没有实现IComparable?

时间:2009-10-27 10:06:11

标签: .net-3.5 interface object implementation icomparable

将项目(其中使用IComparable的模板方法几次)从VS 2005转换为VS 2008时,我遇到了一些错误:

Error 12 Type argument 'Object' does not inherit from or implement 
the constraint type 'System.IComparable'.

这是一个实际的事实,System.Object不再实现该接口,或在转换过程中出错了什么?我能以某种方式解决这个问题吗?

问题在于以下方法:

Public Function ValueIn(Of T As IComparable)(ByVal pValue As T, ByVal ParamArray pArgs() As T) As Boolean
    For Each MyArg As T In pArgs
        If pValue.CompareTo(MyArg) = 0 Then
            Return True
        End If
    Next
    Return False
End Function

甚至是简单的事情:

Dim a as Object = 1
ValueIn(a,1,2)

导致上述错误。它在VS 2005中运行得很好,那么现在可能出现什么问题呢?

4 个答案:

答案 0 :(得分:3)

编辑:我刚刚在VS 2005和2008中尝试了您的代码。

您在项目或源代码文件中配置了Option Strict Off。您的代码从未在第一时间工作,如果您在VS 2005中设置Option Strict On,您将看到错误的真正原因,即类型参数'T'的类型参数推断失败“。我建议在所有VB.NET代码中使用Option Strict On

您在VS 2008中看到了不同的错误,因为它使用的是较新版本的语言,具有非常不同的重载和类型推断规则。在VB.NET 2008中,无论Option Strict是打开还是关闭,编译器都无法解析方法调用。

System.Object类型没有,也从未实现任何接口。

VS 2008中Option Infer的设置与您的代码无关,因为它没有使用任何推断类型。

在两个IDE中修复错误的最简单方法是更改​​调用代码:

    Dim a As Integer = 1
    ValueIn(a, 1, 2)

答案 1 :(得分:1)

如果在Visual Studio 2005中运行调试代码,您将看到来自

的a

Dim a as Object = 1

是一个整数,但如果你使用2008,它会说它是一个对象。

Integer的接口IComparable是inslemented而不是Object。 那么该怎么办? 答案:获得了项目属性(右键单击项目名称并选择属性),在“编译”下进入,除了2005年的一个名为Infer的新字段外,您现在已经有了显式,严格和比较。改变这个价值。

现在我们交叉指出这会起作用。

答案 2 :(得分:0)

System.Object是IComparable?这是怎么回事? IEquatable我可以理解,但IComparable没有意义。

你可以扩展“模板方法”吗?也许这是一个线索。

答案 3 :(得分:0)

我99%肯定这是由.Net 3.5与模板类IComparable的变化引起的。我已经看过几个早期的.NET示例,它们工作正常,但在3.5中产生错误。