当将项目(其中使用了几次 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 中运行得很好,那么现在有什么问题呢?

有帮助吗?

解决方案

编辑: 我刚刚在 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 type 没有也从未实现过任何接口。

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

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

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

其他提示

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

的a

Dim a as Object = 1

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top