【问题标题】:.NET 3.5 - Object not implementing IComparable?.NET 3.5 - 对象没有实现 IComparable?
【发布时间】:2009-10-27 10:06:11
【问题描述】:

在将项目(其中多次使用 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 中完美运行,那么现在可能是什么问题?

【问题讨论】:

    标签: .net-3.5 interface object implementation icomparable


    【解决方案1】:

    编辑:我刚刚在 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)
    

    【讨论】:

    • 实际上,这段代码工作得很好——当然假设给定的参数是相同的类型,但仍然如此。我知道它不是完全安全的,但它以前从未引起过问题。但如果是限制性更强的 VB.NET 2008 编译器的问题,让 Option Strict 为 ;)。谢谢你的回答。
    【解决方案2】:

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

    将 a 调暗为 Object = 1

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

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

    现在我们祈祷这会奏效。

    【讨论】:

    • VS 2008 中Option Infer 的设置与 Brovar 的代码无关,因为它不使用任何推断类型。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 查看带有 System.Collections 和 System.Collections.Generics 的 using 语句。您可能无意中使用了会导致此问题的泛型。
      猜你喜欢
      • 2021-06-05
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多