我有这种奇怪的VB行为。
我需要检查 KeyValuePair集合上的SingleOrDefault()
是否找到了我要搜索的内容。
所以:
Dim revProp As KeyValuePair(Of IKeyInterfaceType, IValueInterfaceType) =
revisionProperties.SingleOrDefault(Function(kvp) ...)
在C#中我会写:
if (revProp.Equals(default(KeyValuePair<IKeyInterfaceType,IValueInterfaceType>)))
Nothing
是C#的default
的VB等价物,事实上如果我写的话
Dim emptyRevProp As KeyValuePair(Of IKeyInterfaceType, IValueInterfaceType) = Nothing
然后在QuickWatch中查看emptyRevProp
,我看到一个带有null键和值的KeyValuePair。
如果我然后将这两个结构与Equals
进行比较:
revProp.Equals(emptyRevProp)
如果True
在集合中找不到满足所提供条件的任何内容,我就会正确获取SingleOrDefault()
。
但是,如果我写的话,问题就出现了:
revProp.Equals(Nothing)
我弄错了。
为什么会这样?
答案 0 :(得分:1)
在VB.NET中,Nothing
可以是null
或default
。在这种情况下,它只被视为null
/ Nothing
。但Nothing
不是KeyValuePair(Of IKeyInterfaceType, IValueInterfaceType)
。因此ValueType.Equals
(覆盖Object.Equals
)会返回False
。参数不是正确的类型,因此它不能相等。来自MSDN:
如果obj和此实例属于同一类型并且表示相同,则为true 值;否则,错误。
source更加明确:
public override bool Equals (Object obj) {
if (null==obj) {
return false; // <---- !!!!!!!!!
}
RuntimeType thisType = (RuntimeType)this.GetType();
RuntimeType thatType = (RuntimeType)obj.GetType();
if (thatType!=thisType) {
return false;
}
// omitting value comparison ...
}
使用时
revProp.Equals(emptyRevProp)
它可以将值相互比较,因此它返回true。
您可以这样使用Nothing
作为default
:
revProp.Equals(CType(Nothing, KeyValuePair(Of IKeyInterfaceType, IValueInterfaceType)))
但是,与首先将其声明为正确的类型相比,这样的可读性会降低。