正如标题所暗示的,我想比较两种类型可能不同的对象。
例如, 我希望将1000.0(十进制)与1000(双精度)进行比较的'真'。 同样,如果我比较10(字符串)和10(双),它应该返回true。
我尝试使用Object.Equals()进行比较,但它不起作用。如果两个对象具有不同的数据类型,则返回false。
Dim oldVal As Object ' assgin some value
Dim newVal As Object 'assgin some value
If Not Object.Equals(oldVal,newVal) Then
'do something
End If
修改 如果我这样做可以吗?
1.check the type of oldVal
2.Covert the type of newVal to oldVal
3.Compare.
答案 0 :(得分:1)
试试这个:
Dim oldVal As Object 'assgin some value
Dim newVal As Object 'assgin some value
Dim b As Boolean = False
If IsNumeric(oldVal) And IsNumeric(newVal) Then
b = (Val(oldVal) = Val(newVal))
ElseIf IsDate(oldVal) And IsDate(newVal) Then
b = (CDate(oldVal) = CDate(newVal))
Else
b = (oldVal.ToString() = newVal.ToString())
End If
If Not b Then
'do something
End If
或者像这样使用IIf:
If Not CBool(IIf(IsNumeric(oldVal) And IsNumeric(newVal),
(Val(oldVal) = Val(newVal)),
IIf(IsDate(oldVal) And IsDate(newVal),
(CDate(oldVal) = CDate(newVal)),
(oldVal.ToString() = newVal.ToString())))) Then
'do something
End If
答案 1 :(得分:0)
混合梨和苹果? :) Equals进行等式比较(参考平等的Equals测试的eefault实现)。而“=”进行身份比较。
如果您需要一个不同的行为来比较两个对象,那么定义一个Equals方法和/或一个CompareTo方法。
要将整数与双精度数比较,您必须(隐式或显式)转换两个操作数之一。
dim i as integer = 1000
dim d as double = 1000.0
return i = CInt(d)
答案 2 :(得分:0)
Object.Equals认为两个值对象在(a)具有相同的二进制表示和(b)按位相等时是相等的,因此对于不同的值类型,它总是会返回false。
您可以尝试使用Convert.ToDouble将所有值转换为double,然后比较双值,如果这适合您的任务;准备好通过转换捕获可能的异常。
答案 3 :(得分:0)
如果使用Option Strict Off
,您基本上已经描述了VB.Net的标准行为?所以只需使用Option Strict Off
,然后编写a = b
事实上我建议你不要这样做因为它很可能会引入错误:)你能解释一下为什么你需要这种行为吗?
答案 4 :(得分:0)
有几种方法可以做到这一点,下面是我觉得最接近你正在寻找的那个,但我个人认为这不是一个很好的方法来构建你的解决方案。
Dim fooObj As New Foo
Dim barObj As New Bar
fooObj.Value = 10
barObj.Value = 10
System.Diagnostics.Debug.WriteLine(barObj.Equals(fooObj))
System.Diagnostics.Debug.WriteLine(barObj.Equals(barObj))
System.Diagnostics.Debug.WriteLine(barObj.Equals(10))
System.Diagnostics.Debug.WriteLine(barObj.Equals(20))
System.Diagnostics.Debug.WriteLine(barObj.Equals("10"))
System.Diagnostics.Debug.WriteLine(barObj.Equals("20"))
System.Diagnostics.Debug.WriteLine(Object.Equals(barObj, 10))
Public Class Foo
Public Value As Integer
End Class
Public Class Bar
Public Value As Integer
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If TypeOf obj Is Bar Then
Dim compareBar As Bar = DirectCast(obj, Bar)
Return MyClass.Value = compareBar.Value
ElseIf TypeOf obj Is Foo Then
Dim compareFoo As Foo = DirectCast(obj, Foo)
Return MyClass.Value = compareFoo.Value
ElseIf TypeOf obj Is Integer Then
Dim compareInt As Integer = DirectCast(obj, Integer)
Return MyClass.Value = compareInt
ElseIf TypeOf obj Is String Then
Dim compareString As String = DirectCast(obj, String)
Return MyClass.Value.ToString() = compareString
End If
Return False
End Function
End Class