高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

element access not allow on array creation?

 定数を配列風にアクセスできるようにして、それを使うというケースは、結構多いです。
たとえばモードを0?2という数字で管理していて*1、あるイベントでそれぞれ別の文字列を表示したい場合、

 string str = new string[] {"CLK", "STW", "KTM"}[(int)watchMode];
※ watchModeは要素が3つの列挙体とします。

 などといったことが出来ます。こういうちょっとしたテクニックは、ソースコードの行数を減らす際に便利です。C#なら#regionディレクティブを使ってソースコードの可読性をごまかせる*2ので良いですが、やはりこういうちょっとしたテクニックは、使っておきたいですね*3
 しかし、こういうのを書くと、なぜかSharpDevelopのフォームエディタが"element access not allow on array creation"というエラーで動かなくなるのですね。コンパイルエラーは出ないし、普通に動くのに。
 エラーに従って修正…したことになるのか、こうすると直ったりします。

 string str = (new string[] {"CLK", "STW", "KTM"})[(int)watchMode];

 まあ、エラー文が、"要素アクセスは、配列生成時には許可されません"みたいな意味ですから、生成順序を見た目ごまかしただけですが、これでフォームデザイナが表示できるようになります。
 SharpDevelopのソースを検証したわけじゃないですが、おそらくC#言語をスクリプトとして実行してるんでしょうから…。
これはスクリプトとして実行すると、コンパイラの文法とは微妙に違うということでしょうか?
まあ、なにはともあれ、同様のことで詰まってる人は、これを試してみてください。

*1:C#の列挙体と数値は相互変換できるので、列挙体で管理してても同じ

*2:ごまかせるというとヘンかもしれませんが、折りたたみ表示でソースコードの可読性を上げた(ように見せ)るというのは、あくまでテクニックとは別物なのだと思います、折りたたみの中が見づらければ意味ないですし。テクニックを使った上で、それでもどうしても長くなる部分を折りたためるようにするというのは、良いのだと思いますが

*3:余談ですが、学校ではこのようなテクニックを見かけることがないのです。言語の知識も重要ですが、こういうちょっとした知恵で行数を減らすのは、やはり大切だと思うのです。リファクタリングするときのことも考えるとか、そういう技術とはちょっと違うことも、学校で教えていただけるとうれしいのですがね