質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

3回答

12589閲覧

C#のswitch文での変数のスコープについて

toshi0607

総合スコア56

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2016/04/12 12:03

C#のswitch文での変数のスコープについての質問です。

caseとdefault内で同じ変数名を使用したいのですが、次のように書くとそれぞれエラーになってしまいます。

private void method() { switch(hoge) { case "a": case "b": Object[] args = { false, "moge", "" }; break; default: # ローカル変数argsはこのスコープで既に定義されています Object[] args = { "hogehoge", "mogemoge" }; break; } }

private void method() { switch(hoge) { case "a": case "b": Object[] args = { false, "moge", "" }; break; default: # ,は無効です # {}は無効です # ;が必要です # breakまたはcontinueに対応するループがありません # 割り当て、呼び出し、インクリメント、デクリメント、待機、および新しいオブジェクト式のみがステートメント式として使用できます # 名前argsは現在のコンテクスト内に存在しません args = { "hogehoge", "mogemoge" }; break; } }

このエラーはどう解消すればよいでしょうか。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

こういうのはどうでしょうか?

C#

1private void method() 2 { 3 switch(hoge) 4 { 5 case "a": 6 case "b": 7 { 8 Object[] args = { false, "moge", "" }; 9 } 10 break; 11 default: 12 { 13 Object[] args = { "hogehoge", "mogemoge" }; 14 } 15 break; 16 } 17 }

スコープを作ってやって、それぞれ別の変数であることをコンパイラに伝えます。

投稿2016/04/12 14:20

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshi0607

2016/04/12 14:42

ありがとうございます!実は各caseでargs使いたいので呼び出せなさそうですね…
guest

0

ベストアンサー

たぶん、下記の実装で問題がないかと
ただし、switchの外からは、args は参照できないと思います。

private void method() { switch(hoge) { case "a": case "b": Object[] args = new Object[]{ false, "moge", "" }; break; default: args = new Object[]{ "hogehoge", "mogemoge" }; break; } }

投稿2016/04/12 13:30

ai_2013_dev

総合スコア338

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshi0607

2016/04/12 14:40

うまくいきました!ありがとうございます!!
guest

0

C#

1private void method() 2 { 3 Object[] args={}; 4 switch(hoge) 5 { 6 case "a": 7 case "b": 8 args = { false, "moge", "" }; 9 break; 10 default: 11 # ,は無効です 12 # {}は無効です 13 # ;が必要です 14 # breakまたはcontinueに対応するループがありません 15 # 割り当て、呼び出し、インクリメント、デクリメント、待機、および新しいオブジェクト式のみがステートメント式として使用できます 16 # 名前argsは現在のコンテクスト内に存在しません 17 18 args = { "hogehoge", "mogemoge" }; 19 break; 20 } 21 }

今実行環境がないので試せていませんがこれでどうでしょうか?
C#はブロックスコープなので共有変数は中括弧内以上の層で定義する必要がありますが,上記コードが通らない理由はcase〜breakの中が条件分岐となり,switchのブロックスコープ上で変数が未定義のまま代入されたり,二重宣言されてしまうことがあるためです。コンパイラがそこまで解析出来ないと言ってもいいかもしれません。

投稿2016/04/12 13:26

編集2016/04/12 13:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshi0607

2016/04/12 14:45

理由説明含めありがとうございます!確かにスコープの外で定義するの適切ですね。 ただ②と同じエラーになってしまいます…
退会済みユーザー

退会済みユーザー

2016/04/12 14:57

なるほど。恐らく変数が未割り当てになってるからですね。動かないコードで申し訳ありませんでした。他の方のコードで解決したようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問