请使用以下代码:
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转换例程(CType或CInt)将值转换为整数.因此,Visual Basic语义在起作用,返回的值为-1.
下一个有趣的线是Convert.ToInt32()
线.这是使用不使用Visual Basic语义的.NET转换例程.相反,它返回基础BCL表示形式的真实布尔值,即1.
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表示.
这可能只是巧合,但......
从MSDN Visual Basic文档:
当Visual Basic将数字数据类型值转换为布尔值时,0变为False,所有其他值变为True.当Visual Basic将布尔值转换为数字类型时,False变为0,True变为-1.
如果值为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)