VB.NET には「リテラル型文字」というものがあって、リテラルに変数型を指定することができます。
http://msdn.microsoft.com/ja-jp/library/s9cz43ek.aspx
多くの場合、暗黙変換とかで事なきを得ますが、気にしておかないといけないのは 16進数との比較とか。たとえば以下の If 文は False なので、Then ブロックは実行されません。
16進数表示指定で 8000 を表示し、その数値を &H8000 で比較しているのにも関わらずです。
Sub Main()
Dim a As Short = -32768
Console.WriteLine("{0:x}", a)
If a = &H8000 Then
' 通らない
Else
Console.WriteLine("False")
End If
End Sub
結果
8000 False 続行するには何かキーを押してください . . .
Then ブロックを実行するためには、If 文を以下のように書く必要があります。
If a = &H8000S Then
つまり &H8000 だと Int32(=Integer) 型で認識され、Int32 型の (8000)16 は 32768 と評価されるため、If の結果が False となります。
&H8000S だと Int16(=Short) 型として認識され、Int16 型の (8000)16 は -32768 と評価されるため、If の結果が True になります。
Select Case を使用すると「表現できない」と警告が出る場合がありますが、If の場合は警告が出ないので要注意です。
また、あまり使うことはないかもしれませんが、SByte にはリテラル型文字がないので、負の領域と比較する場合は SByte を Short にキャストしてから比較するなどの手段を検討する必要があります。
Dim a As SByte = -128 If CShort(a) = &HFF80S Then
いや、その頭の FF が気に入らない、とかだと Byte 型に変換した後に比較するとか。(Byte 型にも リテラル型文字はないので、以下は Int32 に暗黙変換されて比較されます)
Dim a As SByte = -128 If BitConverter.GetBytes(a)(0) = &H80 Then
VB のリテラル型文字一覧
------- 数値型 S Short 例) a = 10S I Integer L Long D Decimal F Single R Double US UShort UI UInteger UL ULong ------- 文字型 c Char 例) a = "A"c