ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

[C#] goto文が引き起こす解りにくいエラー

C#では、メソッドの最初じゃなくても変数を宣言することが可能です。

そこで、ふと、思ったんですよ。

goto tobu;
string str = "あああ";
tobu:
Console.WriteLine(str);


みたいにやったらどうなるのか!?

ローカル変数は宣言が上にある場合、参照出来るはずですが、
goto文で宣言を飛ばしたので宣言は出来ていないはずです。

この矛盾はあって良いのでしょうか!?

VSを起動して、書いてみました。

結果
コンパイルエラー: 未割り当てのローカル変数 'str' が使用されました。

まぁ、しっかり設計されているからエラーになるんでしょうけど、
そこをコンパイルエラーで片付けるか!?
こんな解りにくい事がC#にあったんですね。
解決して欲しいものです。

ちなみに

if (true == false)
{
goto tobu;
}
string str = "あああ";
tobu:
Console.WriteLine(str);

と言う風に、絶対にgotoが実行されない条件分岐を作ると、
コンパイルエラーは無くなり、意図通りに動きました。
("あああ"が出力されました。)

ですが、条件分岐のオペランドで、変数や関数など変動する物を参照すると、エラーになりました。
エラーを免れられるのはリテラルの比較だけです。

return true;
みたいに、戻り値が決まっている関数を書いてもエラーになります。

「gotoは使うな」とよく教わりますが、本当ですね。
ものすごい矛盾ですよ。

変数の宣言は絶対的(静的)にして欲しいです。
その為にはgotoを無くすしかないんでしょうかね。

tag:

コメント

昔goto文使いまくってた僕って・・・;;
まぁ、ActionScript1.0とC#じゃgoto文の使い方がだいぶ違いますがw

  • 2012/11/17(土) 23:25:12 |
  • URL |
  • FlashBoy #-
  • [ 編集 ]

Re: FlashBoy

>昔goto文使いまくってた僕って・・・;;
初期BASICとかアセンブラはそれが普通ですから…。
関係無いか…。

gotoは駄目ですね。
ifにしたり、場合によってはプロシージャで独立させたりしてね。
gotoは排除すべきでしょう。

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/171-ef03cd4e
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。