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

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

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

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

Q&A

解決済

4回答

301閲覧

このC#コードでエラーになる理由がわかりません

Anon_

総合スコア334

C#

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

0グッド

0クリップ

投稿2018/05/15 00:23

編集2018/05/15 04:18

下記のTextData2をnewしたときに言語テキストをセットし、GetList()で言語を指定して取得という処理を行いたいのですが、switchのreturn data箇所でコンテキストが存在しませんというエラーがでてしまいます。
実際にはfruit以外のcaseも設定しますがここでは省いています。
また、GetList()では引数によって結果的にどの型のデータがはいるか明確でないので、このようなメソッドを作ること自体がおかしいでしょうか。

public class Fruit { public string lang { get; set; } public string apple { get; set; } public string banana { get; set; } public string grape { get; set; } } public class TextData2 { public List<Fruit> fruit_list; public void Main(string page) {     dynamic data; switch (page) { case "fruit": fruit_list = new List<Fruit>() { new Fruit(){lang = "ja", apple = "りんご", banana = "ばなな", grape="ぶどう"}, new Fruit(){lang = "en", apple = "apple", banana = "banana", grape="grape"}, }; break; } } public dynamic GetList(string lang, string page) {      dynamic data; switch (page) { case "fruit": data = (from l in fruit_list where l.lang == lang select l).FirstOrDefault(); break; } return data; } }

また、取得する側のコードのvar textdata2 = new TextData2("fruit");の箇所では下記画像のようなエラーがでてしまいますが原因が分からない状況です。
![イメージ説明(0fe89f2c8c50c3da414f04bff7ffba25.png)

//取得側 var textdata2 = new TextData2("fruit"); var fruit_list = textdata2.GetList(lang, "fruit");

追記
イメージ説明

追記2
色々助言をいただいて下記コードに書き直しました。
しかしまだ、下記のエラーがでてしまいます。
fruit_listはコンストラクタでセットしているはずなのですがなぜエラーがでてしまうのでしょうか。

イメージ説明

public class TextData2 { public string Page { get; set; } public List<Fruit> fruit_list; public TextData2() { string page = Page; switch (page) { case "fruit": fruit_list = new List<Fruit>() { new Fruit(){Lang = "ja", Apple = "りんご", Banana = "ばなな", Grape="ぶどう"}, new Fruit(){Lang = "en", Apple = "apple", Banana = "banana", Grape="grape"}, }; break; } } public dynamic GetList(string lang) { dynamic data = new List<string>(); string page = Page; switch (page) { case "fruit": data = (from f in fruit_list where f.Lang == lang select f).FirstOrDefault(); break; } return data; } }

取得側のコード

var textdata2 = new TextData2() { Page = "fruit"}; var fruit_text = textdata2.GetList(lang);

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

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

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

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

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

guest

回答4

0

ベストアンサー

switchのreturn data箇所でコンテキストが存在しませんというエラーがでてしまいます。

switchの後の中括弧がスコープを構築するので、その中で宣言したdataの有効範囲はこのブロックの中に限られてしまいます。「switchに入る前にdataを宣言する」、あるいは「switchの中から直接returnする」などの処置が必要です。

投稿2018/05/15 00:28

maisumakun

総合スコア145121

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

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

Anon_

2018/05/15 00:41

ありがとうございます。質問のコードを修正しました。 コードを修正したところ今度は"return data;のところで未割当のローカル変数が使用されました" というエラーが出るようになりました。 dataはメソッドの引数によって型が変わるのでdynamicとしています。
maisumakun

2018/05/15 00:44

switchで1つもヒットしなかった場合に、代入されないままとなるのでエラーとなります。
Anon_

2018/05/15 01:06

どのように書くのが一般的でしょうか?
maisumakun

2018/05/15 01:09

まず、選択肢が1つしかないのにswitchを使う時点で、「一般的」ではありません。 そして、page != "fruit"だった場合に「どうしたいか」で、どう書くべきかは決まります。
Anon_

2018/05/15 01:22

質問に書きましたが、これは仮のコードなのでfruit以外を省いています。 他にanimalやcarなどがあると思ってください。 fruitのようにそれぞれにヒットしたときに、それぞれのプロパティから値を返したいと思っています。
maisumakun

2018/05/15 01:26

では、「1つもヒットしなかった場合」はどう動作するのが適切でしょうか。
Anon_

2018/05/15 01:46

そうですね。 空のリストを返そうかと思います。
maisumakun

2018/05/15 02:02

switchにdefault:を作って、そこで空のリストを代入するようにしましょう(宣言時に代入してもいいですが)。
Anon_

2018/05/15 02:26

追記に修正したコードを記載しました。 画像のようなエラーがでますがどのように宣言するとよいのでしょうか。
maisumakun

2018/05/15 02:29

varで宣言した場合、型推論により型が固定されてしまいます。本当に多様な型を扱う必要があるのなら、dynamicで宣言しましょう。
Anon_

2018/05/15 05:15

ありがとうございます。 いただいたご助言を基に追記にコードを修正したのですが、まだエラーがでてしまっております。 何かご助言いただけますと助かります。
Anon_

2018/05/15 06:00

どうやら var textdata2 = new TextData2() { Page = "fruit"}; でPageプロパティにfruitをセットしているはずなのですが、 コンストラクタでpageを取得できていません。 コンストラクタ内ではnew時に初期化したデータは取得できないのでしょうか。
guest

0

csharp

1var textdata2 = new TextData2() { Page = "fruit"};

この書き方は初期化子と言って、雑に展開すると

csharp

1var textdata2 = new TextData2(); 2textdata2.Page = "fruit";

こう書いたのと同じ動作をします。
つまりコンストラクタが値設定前に走ります。

コンストラクタで値が必要なのであれば、

csharp

1 public TextData2() 2 { 3 string page = Page;

こうではなく

csharp

1 public TextData2(string page) 2 { 3 Page = page;

こうしたうえで、初期化子ではなく、

csharp

1var textdata2 = new TextData2("fruit");

こうしてください。

投稿2018/05/15 07:39

sh_akira

総合スコア380

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

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

Anon_

2018/05/15 07:58

ありがとうございます。 やはりそういうことなのですね。 仰る通りの方法で期待通りの処理を行うことができました!
guest

0

また、取得する側のコードのvar textdata2 = new TextData2("fruit");の箇所では下記画像のようなエラーがでてしまいますが原因が分からない状況です。

そこに出ているとおりです。
TextData2で、引数一つを取るコンストラクタが定義されていません

投稿2018/05/15 01:05

y_waiwai

総合スコア87719

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

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

Anon_

2018/05/15 05:16

ありがとうございます。 こちらの引数の件は解決できました。 追記に修正コードを記載しましたが、新たなエラーがでてしまっておりますのでご助言いただけますと助かります。
y_waiwai

2018/05/15 06:34

どう解決してるんでしょうか。 コンストラクタを記述したソースを提示してください。 > fruit_listはコンストラクタでセットしているはずなのですがなぜエラーがでてしまうのでしょうか。 セットしている(はずの)コンストラクタも見当たりません
y_waiwai

2018/05/15 06:42 編集

ああ、ソースを追記してるんですね ViualStudioを使っているなら、ブレークポイントを設定して、コードを実行途中で止め、各変数の値を参照できます。、また、1行ごとに実行して各変数の変化を参照することもできます。 闇雲に実行してうまくいかないと言うより、そういうデバッグ機能を使ってご自分で動作検証をなさってください。 「VisualStudio ブレークポイント」などでぐぐると、そこらへんの解説が出てきます
Anon_

2018/05/15 07:57

ご回答ありがとうございます!
guest

0

皆様のおかげで最終的に以下のコードで実装できました。
ありがとうございます。
一番長くお付き合いいただいたmaisumakun様をBAとさせていただきました。

public class TextData2 { public string Page { get; set; } public List<Fruit> fruit_list; public TextData2(string page) { Page= page; switch (page) { case "fruit": fruit_list = new List<Fruit>() { new Fruit(){Lang = "ja", Apple = "りんご", Banana = "ばなな", Grape="ぶどう"}, new Fruit(){Lang = "en", Apple = "apple", Banana = "banana", Grape="grape"}, }; break; } } public dynamic GetList(string lang) { dynamic data = new List<string>(); string page = Page; switch (page) { case "fruit": data = (from f in fruit_list where f.Lang == lang select f).FirstOrDefault(); break; } return data; } }

取得側のコード

var lang = "ja"; var textdata2 = new TextData2("fruit"); var fruit_text = textdata2.GetList(lang);

投稿2018/05/15 08:04

編集2018/05/15 08:48
Anon_

総合スコア334

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

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

sh_akira

2018/05/15 08:44

string Page= page; これでは意味ないです。 Page= page; です。 public string Page { get; set; } ここに入れるという事です。
Anon_

2018/05/15 08:48

あ、すみませんstringが残っておりましたね;; ご指摘ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問