与Nothing相比,与包含Nothing的变量进行比较并不相同

时间:2014-10-06 11:11:52

标签: vb.net equals

我有这种奇怪的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)

我弄错了。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

在VB.NET中,Nothing可以是nulldefault。在这种情况下,它只被视为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)))

但是,与首先将其声明为正确的类型相比,这样的可读性会降低。