拿下面的代码:
- 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
这将打印以下内容:
- -1
- 1
为什么是这样?
(只是一个笑话:)你可以得到0太…
- Int32.TryParse("True",i)
- Console.WriteLine(i)
你看到的是一些遗留代码显示它的头。
事情的核心是VT_BOOL类型。 Visual Basic 6.0使用VT_BOOL类型(AKA VARIANT_BOOL)作为其布尔值。对于VARIANT_BOOL为True,其值为VARIANT_TRUE,其值为-1。在转换到.NET时,决定使用Visual Basic转换例程将布尔值转换为整数值时,Visual Basic 6.0语义将保留在返回值上;它将是-1。
第一个隐式转换发生在b = i行。在底层,这做一个从整数到布尔的隐式转换。任何非零值都被视为true,因此结果值为true。
但是,以下代码行是隐式转换为整数类型。
- i = b
在引擎盖下,使用一个Visual Basic转换程序(CType或CInt)将值转换为整数。因为Visual Basic语义正在播放,返回的值为-1。
下一个有趣的行是Convert.ToInt32()行。这是使用.NET转换程序,不使用Visual Basic语义。相反,它返回一个真正的布尔值为1的底层BCL表示。