0

在将项目(其中多次使用 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

4 回答 4

3

编辑:我刚刚在 VS 2005 和 2008 中都尝试过你的代码。

您已经Option Strict Off在项目或源代码文件中进行了配置。你的代码一开始就没有工作过,如果你Option Strict On在 VS 2005 中设置,你会看到错误的真正原因,即“类型参数'T'的类型参数推断失败”。我建议Option Strict On在所有 VB.NET 代码中使用它。

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

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

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

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

    Dim a As Integer = 1
    ValueIn(a, 1, 2)
于 2009-10-27T10:16:36.360 回答
1

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

将 a 调暗为 Object = 1

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

Integer 具有接口 IComparable,但没有 Object。那么该怎么办?回答:获得项目属性(右键单击项目名称并选择属性),进入“编译”下,现在除了显式、严格和比较之外,您在 2005 年拥有一个名为 Infer 的新字段。更改该值。

现在我们祈祷这会奏效。

于 2009-10-28T14:13:13.663 回答
0

System.Object 是 IComparable 吗?那是怎么工作的?IEquatable 我可以理解,但 IComparable 没有意义。

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

于 2009-10-27T10:22:23.120 回答
0

我 99% 确定这是由 .Net 3.5 中模板类 IComparable 的更改引起的。我见过几个早期的 .NET 示例,它们运行良好,但在 3.5 中会产生错误。

于 2009-10-28T17:04:11.460 回答