所以我们最近将一个应用程序从.NET 1.1迁移到了.NET 4.0。
有了这个,我们必须修复一系列兼容性问题。
其中之一就是一段代码正在抛出InvalidOperationException
。
Public Function MyFunction(ByVal Params As myParams, ByVal ParamArray someNumber As Integer()) As myData
...
If someNumber.BinarySearch(options, MyEnum.Something) >= 0 Then
...
EndIf
...
EndFunction
在我们迁移到.NET4之前,这在.NET1中正常运行。现在基于我一直在阅读的一些主题,有关于这个问题的报道已在.NET4.5中得到修复。为了解决这个问题,我必须在数组的所有元素上实现IComparable接口。
我该如何解决这个问题?我会很感激任何帮助和指针。谢谢!
编辑:添加我们在代码中使用的BinarySearch方法的链接。 https://msdn.microsoft.com/en-us/library/y15ef976.aspx
答案 0 :(得分:0)
将Implements IComparable
IComparable Interface添加到您的班级定义中。 2.为班级添加IComparable.CompareTo
的方法。借用msdn:
Public Class Temperature
Implements IComparable
' The temperature value
Protected temperatureF As Double
Public Overloads Function CompareTo(ByVal obj As Object) As Integer _
Implements IComparable.CompareTo
If obj Is Nothing Then Return 1
Dim otherTemperature As Temperature = TryCast(obj, Temperature)
If otherTemperature IsNot Nothing Then
Return Me.temperatureF.CompareTo(otherTemperature.temperatureF)
Else
Throw New ArgumentException("Object is not a Temperature")
End If
End Function
....
End Class
比较粗略的,CompareTo函数中的代码取决于你的类(你没有提供太多的东西)。所有数字类型(如Int32和Double)都实现IComparable,String,Char和DateTime也是如此。自定义类型还应提供自己的IComparable实现,以便对对象实例进行排序或排序。我相信你的情况可能就是这种情况。我希望这会有所帮助。
答案 1 :(得分:0)
试试这个:
...
Array.Sort(Of Integer)(someNumber) ' only if someNumber is not previously sorted
If Array.BinarySearch(Of Integer)(someNumber, MyEnum.Something) >= 0 Then
...
End If
...
这应该适用于所有.NET框架> 2.0。
答案 2 :(得分:0)
How do I go about to fixing this?
您没有正确使用它。 BinarySearch
是一个共享/静态方法,在尝试将其用作实例方法时不会在Intellisense中显示:
如果你输入它,你会得到一个新的编译器警告:通过实例访问共享成员...将不会被评估。 MSDN没有任何针对.NET 1.1的内容,所以我不知道从那以后它是否发生了变化(可疑)。正确用法:
IndexOf6 = Array.BinarySearch(myIntAry, 6)
这引出了一个问题,作为从.NET 1.x到4.5的转换的一部分,为什么不将其转换为List(Of Int32)
。快速测试表明IndexOf()
方法的速度提高了2-3倍:
IndexOf6 = intList.IndexOf(6)
List<T>
方法也更独立&#39;因为与System.Array
不同,所以不需要对其进行排序以便工作。