所以我有这个(VB,对不起)对象:
Class Foo
Private ReadOnly foo as Integer
Public Overridable ReadOnly Property Foo() as Integer
Get
Return foo
End Get
End Property
Public Overridable Overloads Function Equals(ByVal other as Foo) as Boolean
Return Me.foo.Equals(other.foo)
End Function
Public Overloads Overrides Function Equals(ByVal obj as Object) as Boolean
... some boilerplate ...
Return Equals(DirectCast(obj, Foo))
End Function
End Class
最大的谜团是,当我从数据库加载对象时,在Equals()
中,other.foo
始终为零,即使Foo()
中的值是正确的。
怎么会这样?
Equals方法的另一个版本是:
Private Overloads Function Equals(ByVal other as Foo) as Boolean Implements IEquatable(Of Foo).Equals
Return Me.foo.Equals(other.foo)
End Function
在此版本中, Me.foo
和other.foo
均为零。
答案 0 :(得分:0)
几个小时后,我发现对象类型的Equals()方法是罪魁祸首,可能是因为DirectCast-ed实例绕过了代理。
在第二个例子中,问题是私有实现(of an interface!谁知道!)绕过了代理。
因此,故事的寓意似乎是:避免使用DirectCast,和避免私有接口实现。: - )