.NET 3.5 - 对象未实现 IComparable?
-
06-07-2019 - |
题
当将项目(其中使用了几次 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中运行调试代码,您将看到来自
的aDim a as Object = 1
是一个整数,但是如果你使用2008,它将声明它是一个对象。
Integer的接口IComparable是inslemented而不是Object。 那么该怎么办? 答案:获得了项目属性(右键单击项目名称并选择属性),在“编译”下进入,除了2005年的一个名为Infer的新字段外,您现在已经有了显式,严格和比较。改变这个价值。
现在我们交叉指出这会起作用。
System.Object是IComparable?这是怎么回事? IEquatable我可以理解,但IComparable没有意义。
您可以展开“模板方法”吗?也许这是一个线索。
我99%肯定这是由.Net 3.5与模板类IComparable的变化引起的。我已经看过几个早期的.NET示例,它们工作正常,但在3.5中产生错误。