我很困惑,无法在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。
答案 0 :(得分:2)
这里有两件事在起作用:
具有各种运算符(例如=,+,-,*,/等)的数字和字符串情况将转换为相应的数字和数字重载。例如。 "1"=1
编译为CDbl("1")=CDbl(1)
。
由于历史原因,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”(操作类型)的网格,它指示了这种行为-尽管可能有些微妙。