Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么vb.nets'=';操作员是否以这种方式评估不同的类型?_Vb.net - Fatal编程技术网

为什么vb.nets'=';操作员是否以这种方式评估不同的类型?

为什么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

我感到困惑,无法找到有关在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(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中是如何准确工作的,以避免将来出现任何问题的。我很想知道它的具体细节,因为我不知道它是如何工作的,除非您只是再次转换回
    字符串,或者使用
    选项严格关闭
    。就像我说的,你应该