为什么vb.nets'=';操作员是否以这种方式评估不同的类型?
我感到困惑,无法找到有关在vb.net中如何计算“=”运算符的规则的信息,特别是在比较不同类型时为什么vb.nets'=';操作员是否以这种方式评估不同的类型?,vb.net,Vb.net,我感到困惑,无法找到有关在vb.net中如何计算“=”运算符的规则的信息,特别是在比较不同类型时 Dim x as String = "1" Dim y as Integer = 1 Dim z as Boolean = true 当我比较这些类型时(调试程序时),它们的评估如下: x = y (True) y = z (False) x = z (True) 因为x=y和x=z,我希望y=z也是正确的 我假设有一些转换正在进行,但我不确定这是如何工作的细节;因为CBool(y)和CBool
Dim x as String = "1"
Dim y as Integer = 1
Dim z as Boolean = true
当我比较这些类型时(调试程序时),它们的评估如下:
x = y (True)
y = z (False)
x = z (True)
因为x=y和x=z,我希望y=z也是正确的
我假设有一些转换正在进行,但我不确定这是如何工作的细节;因为CBool(y)和CBool(x)都评估为真。这里有两件事在起作用:
“1”=1
编译为CDbl(“1”)=CDbl(1)
True
的布尔值映射为-1
的整数。因此,True=1是False;但是True=-1是真的选项严格关闭,或者通过警告配置“隐式转换”(项目属性窗口的“编译”选项卡)置于更精细的控制之下。是的,这很奇怪,其他基础知识(如QBasic或QuickBasic)不这样做,但早在Visual Basic开发时(即第一代VBA/VB6),它在当时似乎是个好主意。我敢打赌它与VBA有关,VBA是Microsoft Access的存储过程语言(如果你愿意的话);在MS SQL Server、Oracle和DB2的SQL方言中,一定会将数字和字符串转换为相应的数字和数字重载。亲自试一试-例如在SQL Server中:
声明@x varchar(250)='1',@y int=1
选择(如果@x=@y,则为1,否则为0结束)
至于转换为整数时的真值为-1,这可以追溯到Altair BASIC()。让AND和OR在逻辑操作(而不是按位操作)的上下文中不按预期工作是一个技巧。为了澄清,AND/OR/NOT确实是位运算符-例如NOT 1=-2。因此,对于像Not True
这样的结果,如果False
(即0),True
必须是-1。Altair BASIC通过VBA/VB6没有真正的逻辑运算符-其中的逻辑运算通过对整数的逐位运算进行模拟。然而,VB.NET确实有真正的逻辑运算符,但当然必须注意整数,因为它会对它们执行遗留行为
官方语言参考位于。目前,有一些标题为“操作类型”的网格表明了这种行为——尽管可能有些微妙。这里有两件事在起作用:
带有各种运算符(如=、+、-、*、/)的数字和字符串情况将转换为相应的数字和数字重载。例如,“1”=1
编译为CDbl(“1”)=CDbl(1)
出于历史原因,True
的布尔值映射为-1
的整数。因此,True=1是False;但是True=-1是真的
这个数字和字符串可以通过选项严格关闭,或者通过警告配置“隐式转换”(项目属性窗口的“编译”选项卡)置于更精细的控制之下。是的,这很奇怪,其他基础知识(如QBasic或QuickBasic)不这样做,但早在Visual Basic开发时(即第一代VBA/VB6),它在当时似乎是个好主意。我敢打赌它与VBA有关,VBA是Microsoft Access的存储过程语言(如果你愿意的话);在MS SQL Server、Oracle和DB2的SQL方言中,一定会将数字和字符串转换为相应的数字和数字重载。亲自试一试-例如在SQL Server中:
声明@x varchar(250)='1',@y int=1
选择(如果@x=@y,则为1,否则为0结束)
至于转换为整数时的真值为-1,这可以追溯到Altair BASIC()。让AND和OR在逻辑操作(而不是按位操作)的上下文中不按预期工作是一个技巧。为了澄清,AND/OR/NOT确实是位运算符-例如NOT 1=-2。因此,对于像Not True
这样的结果,如果False
(即0),True
必须是-1。Altair BASIC通过VBA/VB6没有真正的逻辑运算符-其中的逻辑运算通过对整数的逐位运算进行模拟。然而,VB.NET确实有真正的逻辑运算符,但当然必须注意整数,因为它会对它们执行遗留行为
官方语言参考位于。目前,有一些标题为“操作类型”的网格表明了这种行为——虽然可能是微妙的。只是永远不要以这种方式比较不同的类型,你会赢;我没有任何问题。如果两个不同类型的值由于其类型不同而不可能相等,为什么还要知道它们是否相等?为了测试相等性,必须首先将一个值转换为另一个值的类型,并且您永远不应该依赖于以您想要的方式隐式地进行转换。始终执行到所需类型的显式转换,然后比较相同类型的两个值。如果您像往常一样将选项设置为Strict On
,您发布的代码将无法编译。@jmcilhinney我理解这个逻辑,这是我通常遵循的;在VisualStudio告诉我输入'If Date=CDate(string)'后,我的演员阵容是多余的,我特别进入了这一行。我想知道“=”操作符在vb.net中是如何准确工作的,以避免将来出现任何问题的。我很想知道它的具体细节,因为我不知道它是如何工作的,除非您只是再次转换回字符串,或者使用选项严格关闭。就像我说的,你应该