例えばVB.NETで次のようなコードは正しいでしょうか?
Dim s As String = "123,456,789" Dim ss As String() ss = s.Split(",")
このコードは問題なく動作するかもしれません。しかしプロジェクトの「Option Strict」を「On」とし、暗黙的なデータ型変換を制限すると、「Option Strict On で 'String' から 'Char' への暗黙的な変換はできません。」というエラーが発生します。これは、String.Splitメソッドの第一引数にChar型が必要であるにもかかわらず、String型を指定したために発生したエラーです。Option Strict Offの時にエラーが発生しなかったのは、String型をChar型に勝手に変換してくれていたからです。VB.NETユーザーはお気づきでなかった方も多いかもしれませんが、","はChar型ではなく、あくまでString型でしかなかったのです。
それではChar型を指定するにはどうすればよいのでしょうか?結論を先に言えば上記の例では、","cとすればよかったのです。","にサフィックス'c'を付けることにより、「これはChar型だ」とコンパイラに教えてあげることが出来るのです。上記の例をOption Strict Onでも正しいように書き直すと次のようになります。
Dim s As String = "123,456,789" Dim ss As String() ss = s.Split(","c)
先の例は文字リテラルについてでしたが、整数や実数についてもリテラルの表記法により型が意図したものと違って解釈されるケースがありえます。リテラルに適当なサフィックスを指定しなかったためにエラーが起こる場面はまれですが、明確な型指定を出来るだけすべきでしょう。
以下にリテラルに指定するサフィックス(接尾語)と型を表にします。
VB.NET | C# | |||||
---|---|---|---|---|---|---|
型 | サフィックス | 例 | 型 | サフィックス | 例 | |
整数 | Short | S | 100S | short | 100 | |
Integer | (なし)/I | 100I | int | (なし) | 100 | |
Long | (なし)/L | 100L | long | (なし)/l/L | 100L | |
UInteger | UI | 100UI | uint | (なし)/u/U | 100U | |
ULong | UL | 100UL | ulong | (なし)/u/U/UL/Ul/uL/ul/LU/Lu/lU/lu | 100UL | |
実数 | Single | F | 0.1F | float | F/f | 0.1F |
Double | (既定)/R | 0.1 | double | (既定)/D/d | 0.1 | |
Decimal | D | 0.1D | decimal | M/m | 0.1M | |
文字 | Char | ""c | "a"c | char | '' | 'a' |
注:VB.NETのUIntegerとULong型は、.NET Framework 2.0から追加されました。
上記の表で(なし)と(既定)はサフィックスがない場合に判断される型を示します。VB.NETの整数リテラルではサフィックスがない場合、Integer型の範囲内の値はInteger型に、Integer型の範囲を超える値はLong型になります。C#の整数リテラルではサフィックスがない場合、int、uint、long、ulong のうち、その値を表すことができる最初の型になります。実数型のサフィックスが指定されていない場合、実数リテラルの型はdoubleとなります。
ちなみに整数リテラルでは10進数以外に、16進数とVB.NETでは8進数も可能です。VB.NETで16進数リテラルは先頭に&Hを(例:&H1FA5)、8進数は&Oをつけます(例:&O4217)。C#で16進数リテラルは先頭に0xをつけます(例:0x1FA5)。
最後にVB.NETの日付リテラルについても簡単に説明しておきます。日付リテラルは、Date型の値を表します。例えば、2003年8月31日午前10時30分45秒は
#8/31/2003 10:30:45 AM#
のようになります。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。