在VB.NET中将Boolean转换为Integer

Pra*_*ter 34 vb.net

请使用以下代码:

Sub Main()

    Dim i As Integer
    Dim b As Boolean

    i = 1
    b = i
    i = b
    Console.WriteLine(i)

    i = Convert.ToInt32(b)
    Console.WriteLine(i)

End Sub
Run Code Online (Sandbox Code Playgroud)

这打印出以下内容:

-1
1
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

(只是一个笑话:)你也可以得到0 ...

Int32.TryParse("True", i)
Console.WriteLine(i)
Run Code Online (Sandbox Code Playgroud)

Jar*_*Par 45

您所看到的是一些显示其头部的遗留代码.

问题的核心是VT_BOOL类型.Visual Basic 6.0使用VT_BOOL类型(AKA VARIANT_BOOL)作为其布尔值.VARIANT_BOOL的True用值VARIANT_TRUE表示,其值为-1.在转换为.NET期间,决定在使用Visual Basic转换例程将布尔值转换为Integer值时,将在返回值上维护Visual Basic 6.0语义; 它会是-1.

第一次隐式转换发生在b = i行.在引擎盖下,这会执行从整数到布尔值的隐式转换.任何非零值都被视为真,因此结果值为真.

但是,以下代码行正在执行到整数类型的隐式转换.

i = b
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,它使用一个Visual Basic转换例程(CTypeCInt)将值转换为整数.因此,Visual Basic语义在起作用,返回的值为-1.

下一个有趣的线是Convert.ToInt32()线.这是使用不使用Visual Basic语义的.NET转换例程.相反,它返回基础BCL表示形式的真实布尔值,即1.

  • 您可能想要添加一些关于WHY使用的VT_BOOL以及它的值为-1的原因.VB 6只有一组"和"和"或"运算符,它们执行逻辑和按位运算(大多数语言都有2组).这通过使"和"实现为"&"并且文字默认为-1来起作用. (4认同)

Pow*_*ord 29

有些语言认为布尔值为-1而不是1.我不得不做研究,看看为什么,我不记得了.

在VB6中,常量True具有值-1.

但是,Convert.ToInt32(Boolean)记载为返回"数字1值是否为真;否则,0".这样,无论您使用哪种框架语言,都是一样的.

编辑:查看问题布尔值true - 正1或负1


Rol*_*ble 10

至于为什么-1用于True,我相信这是因为它是字面意思(不是0).

从零开始,翻转所有位,然后读取它作为二进制补码 - 出现负数.

因此,任何非False都是True,而False是0,(NOT False)由-1表示.

这可能只是巧合,但......

  • 这正是VB使用-1表示True的原因.:) (3认同)

Arn*_*nce 7

从MSDN Visual Basic文档:

输入转化次数

当Visual Basic将数字数据类型值转换为布尔值时,0变为False,所有其他值变为True.当Visual Basic将布尔值转换为数字类型时,False变为0,True变为-1.

对于Convert.ToInt32(value):

如果值为true,则返回数字1; 否则,0.

所以对于你的代码:

i = 1
b = i // b becomes true
i = b // true = -1
Console.WriteLine(i)  // i is -1

i = Convert.ToInt32(b)  // Convert.ToInt32(true) = 1
Console.WriteLine(i)    // i is 1
Run Code Online (Sandbox Code Playgroud)