Nothing = String.Empty(为什么这些相等?)

Jus*_*son 25 vb.net string nothing

为什么第一个if语句评估为true?我知道如果我使用"是"而不是"="那么它将不会评估为真.如果我将String.Empty替换为"Foo",则它不会评估为true.String.Empty和"Foo"都有相同类型的String,那么为什么一个评估为true而另一个不评估?

    //this evaluates to true
    If Nothing = String.Empty Then

    End If

    //this evaluates to false
    If Nothing = "Foo" Then

    End If
Run Code Online (Sandbox Code Playgroud)

Reb*_*off 19

VB.net中没有任何内容是类型的默认值.该语言规范说,在节2.4.7:

没有什么是特殊的文字; 它没有类型,可以转换为类型系统中的所有类型,包括类型参数.转换为特定类型时,它等效于该类型的默认值.

因此,当您对String.Empty进行测试时,Nothing将转换为长度为0的字符串.Is运算符应该用于测试Nothing,而String.Empty.Equals(Nothing)也将返回false.

  • 当使用带有字符串的=运算符时,VB.NET使用StrCmp而不是op_Equality.我推测这是出于向后兼容的原因. (10认同)
  • @recursive:是的,确实如此.这也适用于VB.主要答案是不正确的,真正的原因在Rebecca的评论中给出:VB.NET在将字符串与=进行比较时调用StrCmp.此方法具有特殊代码来处理""= Nothing为true.如果你试试"".Equals(Nothing)你就会弄错. (5认同)
  • 但是不是`String``Nothing`的默认值而不是````? (4认同)
  • @RebeccaChernoff这个答案完全是误导性的:default(String)是null,而不是String.Empty,因为String是引用类型。正确答案是海因兹(Heinzi)的答案,或者您对“ StrCmp”的评论。请修改您的答案,以备将来参考。 (3认同)

Hei*_*nzi 10

这是VB =<>运算符的特例。

语言规范中第11.14节规定:

在进行字符串比较时,空引用等效于字符串文字“”。


如果您有兴趣进一步的细节,我写的深入比较vbNullStringString.Empty""Nothing在VB.NET这里:

  • 这应该是公认的答案。[当前接受的答案](/sf/answers/184329211/)是错误的,正确答案仅在其注释中给出。 (2认同)