将项目(其中使用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中运行得很好,那么现在可能出现什么问题呢?
答案 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中运行调试代码,您将看到来自
的aDim 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中产生错误。