Boolean の整数化ですが、使う関数によって結果が異なります。要注意。
コード
Imports System.Console Module Module1 Sub Main() Dim a As Boolean = True WriteLine(CInt(a)) WriteLine(System.Convert.ToInt32(a)) End Sub End Module
結果
-1 1
C系は 1 、BASICは -1 というのが歴史だからか…
ともかく「BASICなんだから -1」と信じていると足をすくわれそうです。
匿名
boolean型のキャストにCIntを使うのは間違いかと。
ToInt32は、boolean型でのtrueの定義順を返しているわけで、大抵の言語は[1]基準ではなく[0(ゼロ)]基準なので、falseは0番目に定義しているから[0],trueは1番目に定義(1基準なら2番目に定義)しているから[1]が返されるのかと。
例えば仮に拡張ブーリアン型として[ ExtBoolean = ( ExtFalse, ExtMiddle, ExtTrue
)]が存在するとして、ToInt32が対応していれば、ExtTrueは0基準で2番目なので[ 2
]が返される事に成るかと。
対してCIntは変数のメモリ領域に格納されている16進値を抽出して、整数に無理やり変換しているだけですね。
いずれにしろboolean型の型変換に非対応なCIntを使うのが変なわけで、これで、コンパイルが通るVBの仕様が変。本来、エラーとしてハネるべきだろうに。
別な説明をすると、他の言語ですと列挙型というのが有り、先の拡張型ブーリアンを定義できます。VB風に記載するとこんな感じかな。
Type ExtBoolean = ( ExtFalse, ExtMiddle, ExtTrue)
Dim ebFlag As ExtBoolean
ebFlag = ExtTrue
WriteLine( ToInt32 ( ebFlag ) ) とすれば[ 2 ]が表示される。
論理型は定義済み列挙型と見れば良いのかと。
Link | 2016年6月9日 19:33