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

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

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

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

Q&A

解決済

4回答

1325閲覧

switch文における変数の定義のエラー

g-prg

総合スコア14

C#

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

0グッド

0クリップ

投稿2020/01/14 01:28

プログラミング初学者です。
特にC#は始めたばかりです。

以下のプログラミングを実行するとエラーが出ます。

using

1using System.Collections.Generic; 2using System.Linq; 3using System.Text; 4using System.Threading.Tasks; 5 6namespace BookProblem204_3 7{ 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 Console.WriteLine("月(1~12)を入力して下さい"); 13 int m = int.Parse(Console.ReadLine()); 14 string d; 15 16 switch(m) 17 { 18 case 2: 19 d = "28か29"; 20 break; 21 case 4: 22 case 6: 23 case 9: 24 case 11: 25 d = "30"; 26 break; 27 case 1: 28 case 3: 29 case 5: 30 case 7: 31 case 8: 32 case 10: 33 case 12: 34 d = "31"; 35 break; 36 default: 37 Console.WriteLine("適切な値を入力して下さい"); 38 break; 39 } 40 Console.WriteLine("{0}月の長さは{1}日です", m, d); 41 } 42 } 43}

エラーの内容は「未割り当てのローカル変数 'd' が使用されました」というものです。

string d;
という変数の定義では何故ダメなのでしょうか??

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

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

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

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

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

Zuishin

2020/01/14 01:35

default の時に未割り当てです。
guest

回答4

0

エラーの内容は「未割り当てのローカル変数 'd' が使用されました」というものです。

defaultに飛んだ場合、dに代入がなされないまま、最後のConsole.WriteLine("{0}月の長さは{1}日です", m, d);dにアクセスすることとなってしまいます。

投稿2020/01/14 01:37

maisumakun

総合スコア145184

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

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

0

ベストアンサー

1~12以外が入れられたときにメッセージが出されるだけでプログラムが終了しないまま最後のコンソールにいくので未割り当てのまま変数dが持っていかれるコードになっています。

空文字でもなんでも型にあわせた値を先にいれておくのが確実です。

また、default文であってもbreakはswitchを抜けるだけなので「後続の処理はしない」のでしたらreturnなどでメソッド自体を抜けるようにしましょう。

投稿2020/01/14 01:40

編集2020/01/14 01:59
m.ts10806

総合スコア80850

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

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

maisumakun

2020/01/14 01:42

あとは、defaultのときはreturnで脱出、ということもありかと思います。
m.ts10806

2020/01/14 01:46

string d = ""; のように定義と初期化を同時にする癖をつけておくと今後悩まなくて済むかなと思って推しました。 見た感じ欲しい値以外はハネたいのかなと思うのでreturnで脱出は必要かもしれませんね。 念のため書いておきます。
maisumakun

2020/01/14 01:56

> また、default文でbreakってあんまり書かないかなと。 慣習的に最後に書かれるのでいちいち記載しなくてもswitchは抜けます。 C#では必須です。
m.ts10806

2020/01/14 01:58

失礼、修正します
g-prg

2020/01/14 02:02

丁寧な回答ありがとうございます! 最初の定義の際に string d = ""; とすべきなのですね! 大変初歩的な質問で申し訳ないのですが、プログラミングにおいて「変数」というものは定義しない場合は、「空」とみなされるわけではないということでしょうか? 「変数」というと「箱」をイメージしてしまっていて、 string d; で「d」という箱を作った場合は「空」のdの箱ができてしまうものだと思っていました。 なので上記のコードにおいても例えば「13」と入力すれば勝手に 「13月の長さは日です」 と空の状態で表示されるものだと思っていました。 (本当は回答していただいたとおりそのまえにreturnで脱出するべきですよね!(汗))
m.ts10806

2020/01/14 02:12 編集

変数が箱であるという考え方は間違ってませんが、何も入れてないなら箱がそこにあるだけです。中身を見ようにも何もしてないのでundefined状態です。 言語によってはNullとして解釈してくれるものもあるかもしれませんがC#ではそのような仕様になってないだけだと思います。 Javaでも同じようなエラーになります。 PHPのプロパティはNullになりました。
g-prg

2020/01/14 02:24

なるほどですね! 実はこの間までPHPを勉強していて、時間が空いてから仕事の関係でC#を勉強しなければいけなくなったので仕様の違いに混乱していました。 回答していただき本当にありがとうございます。
m.ts10806

2020/01/14 02:35

解決されたようで何よりです。 そこはまあエラーが教えてくれるので、適宜対応でも良いのかなと。 どの言語もフレームワークも「そういう仕様」で飲み込む必要が発生する場面は少なくないです。
guest

0

dが空になる可能性があるからじゃないでしょうか?
今回の場合はmが2,11,12の時以外はdに何も入っていません。
switch文やif文で後から値を設定する場合は、初期値を入れる必要があります。

投稿2020/01/14 01:38

RyotaroIsoyama

総合スコア183

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

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

maisumakun

2020/01/14 01:41

> 今回の場合はmが2,11,12の時以外はdに何も入っていません。 4・6・9のときは11と同じ「d = "30";」が、1・3・5・7・8・10のときは12と同じ「d = "31";」が実行されます。
RyotaroIsoyama

2020/01/14 01:43

あ!ほんとですね 失礼しました
guest

0

例えば、string d = null と初期化して、もしdnullならConsole.WriteLineを呼ばないようにすると良いです。

投稿2020/01/14 01:45

mmaeda

総合スコア269

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問