为什么vb.nets'='运算符以这种方式评估不同类型?

时间:2019-06-17 15:53:44

标签: vb.net

我很困惑,无法在vb.net中找到有关'='运算符的求值规则的信息,特别是在比较不同类型时。

Gemfile.lock

当我比较这些类型(调试程序)时,它们的评估如下:

Dim x as String = "1"
Dim y as Integer = 1
Dim z as Boolean = true

由于x = y和x = z,所以我希望y = z也正确。

我假设正在进行一些转换,但是我不确定其工作方式的具体细节;因为CBool​​(y)和CBool​​(x)都评估为true。

1 个答案:

答案 0 :(得分:2)

这里有两件事在起作用:

  1. 具有各种运算符(例如=,+,-,*,/等)的数字和字符串情况将转换为相应的数字和数字重载。例如。 "1"=1编译为CDbl("1")=CDbl(1)

  2. 由于历史原因,True的布尔值被映射到-1的整数。因此True = 1是False;但是True = -1是True。

可以通过Option Strict On关闭此数字字符串项目,也可以通过“配置属性”窗口的“编译”选项卡的“警告配置”“隐式转换”将其置于更细粒度的控制之下。是的,很奇怪,其他BASIC(例如QBasic或QuickBasic)没有做到这一点,但是回想起开发Visual Basic(即第一代VBA / VB6)时,这在当时似乎是个好主意。我敢打赌它与VBA是Microsoft Access的存储过程语言(如果可以的话)有关;在MS SQL Server,Oracle和DB2的SQL方言中,确实发生了将数字和字符串转换为相应的数字和数字过载的情况。尝试一下,看看自己-例如在SQL Server中:

declare @x varchar(250) = '1',@y int = 1
Select (Case When @x=@y Then 1 Else 0 End)

对于将True转换为整数时为-1,这可以追溯到Altair BASIC(https://en.wikipedia.org/wiki/Altair_BASIC)。让AND和OR尤其是NOT不能按逻辑操作(而不是按位操作)的上下文工作是一个技巧。需要澄清的是,AND / OR / NOT确实是按位运算符-例如非1 = -2。因此,对于像Not True这样的结果作为False(它是0),True必须为-1。通过VBA / VB6的Altair BASIC没有真正的逻辑运算符-它们中的逻辑运算是通过对整数进行按位运算来模拟的。 VB.NET确实具有真正的逻辑运算符,但是必须小心使用整数,因为它将对整数进行遗留行为。

官方语言参考位于https://github.com/dotnet/vblang/blob/master/spec/README.md。在https://github.com/dotnet/vblang/blob/master/spec/expressions.md,有标题为“ Operation Type”(操作类型)的网格,它指示了这种行为-尽管可能有些微妙。