DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

リテラルの表記

例えばVB.NETで次のようなコードは正しいでしょうか?

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でも正しいように書き直すと次のようになります。

VB.NET
コードを隠すコードを選択
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#
のようになります。

  • 履歴:
  • 2007/2/5 .NET Framework 2.0に関する記述を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。