AscWとChrWは特別に定数として評価される
AscW
と ChrW
は特別に定数として評価される
Visual Basic で定数を定義する時には Const ステートメントを用います。
Const Statement (Visual Basic) | Microsoft Docs
Const constInteger = 42 Const constChar = "c"c Const constString = "string"
必ず何かで初期化する必要があり、=
の後ろの部分は initializer
と呼ばれています。
この initializer
には通常、変数や関数呼び出しを置くことができないと決まっているのですが、
例外が幾つかあり単純な AscW
呼び出しと単純な ChrW
呼び出しがその例外の中に含められています。
どういうわけか ChrW
も定数として評価されると今のドキュメントに書かれていないようですが、間違いなく定数として
使えます。隠し機能などではなく単に書き忘れでしょう。
これらの呼び出しはVisual Basicコンパイラが簡単に定数として計算できます。ユーザーは定数として評価できる関数を書くことができませんが、コンパイラはAscW
呼び出しと ChrW
呼び出しを特別に処理します。このような特別な処理を「コンパイラマジック」などと呼んだりします。
ちなみにAsc
と Chr
も特別に定数として評価されるので、使っている方はこちらも見てください。
以下は AscW
と ChrW
が定数として評価されていることを確かめるサンプルコードです。
コード
Module Program Private Sub WriteLine(Of T)(obj As T) Console.WriteLine($"{obj.GetType()} {obj}") End Sub Sub Main() Const ascA1 = AscW("A"c) WriteLine(ascA1) Const ascA2 = AscW("ABC") WriteLine(ascA2) Const ascあ = AscW("あ") WriteLine(ascあ) Const chr65 = ChrW(65) WriteLine(chr65) Const chr12354 = ChrW(12354) WriteLine(chr12354) Console.ReadKey() End Sub End Module
実行結果
System.Int32 65 System.Int32 65 System.Int32 12354 System.Char A System.Char あ
コンパイルが通りますし、もちろん正しく実行もできます。