定数に値を代入した時のエラーメッセージが分かりづらい件について
プログラミング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製ツールの問題みたいです。