ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

定数に値を代入した時のエラーメッセージが分かりづらい件について

プログラミングC# p34

こんなプログラムを書くと、

class SymbolicConstants
{
                static void Main()
                {
                                const int FreezingPoint = 32;
                                const int BoilingPoint = 212;

                                System.Console.WriteLine("水の凝固点:{0}", Freez
ingPoint);
                                System.Console.WriteLine("水の沸点:{0}", Boiling
Point);

                                 BoilingPoint = 22;
                }
}

こんなコンパイルエラーが出ます。

SymbolicConstants.cs(11,6): error CS0131:
        代入式の左辺には変数、プロパティ、またはインデクサを指定してください。

意味が分からん。。
ついでに他の言語でどうなるかやってみた。


■Java1.6.0_03

public class SymbolicConstants
{
                public static void main(String[] args)
                {
                                final int FreezingPoint = 32;

                                FreezingPoint = 22;
                }
}

結果はこう。

SymbolicConstants.java:7: final 変数 FreezingPoint に値を代入することはできませ
ん。
                                FreezingPoint = 22;
                                ^
エラー 1 個

普通に分かりやすい。


ruby 1.9.0 (2007-12-25 revision 14709) [i386-mswin32]

FreezingPoint = 32

FreezingPoint = 22

ちなみに、定数 - 変数と定数 - Rubyリファレンスマニュアルによれば、

アルファベット大文字 ([A-Z]) で始まる識別子は定数です。

とのことです。
で、結果はこう。

SymbolicConstants.rb:3: warning: already initialized constant FreezingPoint

これまた普通に分かりやすい。


→これ、良く見たらwarningだった。試しに上書きした結果を表示してみる。

FreezingPoint = 32
puts "FreezingPoint = #{FreezingPoint}"

FreezingPoint = 22
puts "FreezingPoint = #{FreezingPoint}"

結果はこう。

FreezingPoint = 32
SymbolicConstants.rb:4: warning: already initialized constant FreezingPoint
FreezingPoint = 22

おっと。強引に上書きできてしまうんですね。危険。


■gcc3.4.4

main()
{
        const int FreezingPoint = 32;
        FreezingPoint = 22;
}

結果はこう。

SymbolicConstants.c: In function `main':
SymbolicConstants.c:4: error: assignment of read-only variable `FreezingPoint'

やっぱり分かりやすい。


■Perl5.8.7

use constant FreezingPoint => 32;

FreezingPoint = 22;

http://www2u.biglobe.ne.jp/~MAS/perl/waza/const.html
のサイトを参考にさせてもらいました。
結果はこう。

Can't modify constant item in scalar assignment at SymbolicConstants.pl line 3,
near "22;"
Execution of SymbolicConstants.pl aborted due to compilation errors.

普通に分かりやすい。


JavaScript
定数定義を行う構文なし。(ちょっと意外)
ECMA-262 4th Edition(ECMAScript4)ではconstキーワードがサポートされるらしい。


。。。というわけで、MS製ツールの問題みたいです。