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

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

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

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

Q&A

解決済

1回答

3540閲覧

【C#】switch式をステートメントとして使用したい。

YamakawaJunichi

総合スコア632

C#

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

0グッド

0クリップ

投稿2020/04/22 02:00

C#8.0でswitch式が導入され、従来の case: break; から => で書けるようになりました。
ですが、従来のswitch文では => が使えず、switch式を単独で使うと「割り当て、呼び出し、インクリメント、デクリメント、新しいオブジェクトの式のみがステートメントとして使用できます」のコンパイルエラーとなります。
switch式を文として使う方法は無いでしょうか?

C#

1int i = 1; 2 3// コンパイルエラー 4i switch 5{ 6 0 => //DoSomething 7 1 => //DoSomething 8 2 => //DoSomething 9 _ => //DoSomething 10}; 11 12// コンパイルエラー 13switch(i) 14{ 15 0 => //DoSomething 16 1 => //DoSomething 17 2 => //DoSomething 18 _ => //DoSomething 19}; 20 21// 値を受け取ればコンパイルは通るが、より良い書き方は無いか 22var _ = i switch 23{ 24 0 => //DoSomething 25 1 => //DoSomething 26 2 => //DoSomething 27 _ => //DoSomething 28};

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

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

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

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

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

Zuishin

2020/04/22 02:07 編集

switch 文を使えばいいのでは? 式である以上、戻り値は必要です。 case 0: DoSomething(); break;
YamakawaJunichi

2020/04/22 02:08

それはそうなのですが、できることならcase: break; なんて書きたくないですからね・・・
Zuishin

2020/04/22 02:24

switch 式だと、各ケースで同じ型のオブジェクトを返す必要がありますが、それはいいんですか?
YamakawaJunichi

2020/04/22 02:31

今のところ不可能ということがわかりました、コメントありがとうございました。 Zuishinさん > switch 式だと、各ケースで同じ型のオブジェクトを返す必要がありますが、それはいいんですか? おっしゃる通り、voidが返せないですね。
Zuishin

2020/04/22 02:46

何か代替となる方法はないかと考えてみましたが、switch 文以上に簡潔な記述のものは思いつきませんでした。
Zuishin

2020/04/22 02:51

switch 式の戻り値だけの問題であれば、関数の中に入れて return してやれば済むことなので、拡張メソッドか何かで工夫してラムダ式の中に突っ込めば済むと思います。つまり、何らかの方法でデリゲートに変換してやれば文にできます。 ケースについては、これもやはり文を式に変えて何か戻り値を返す仕組みを作ればできそうです。 問題はラムダ式を使うとかえって記述量が増えることですね。
Zuishin

2020/04/22 03:02 編集

public static T Chain<T>( this T source, Action<T> action) { if (action == null) throw new ArgumentNullException(nameof(action)); action(source); return source; } public static TResult Chain<TSource, TResult>( this TSource source, Func<TSource, TResult> func) { if (func == null) throw new ArgumentNullException(nameof(func)); return func(source); } これは私がよく使う拡張メソッドなのですが、次のように使います。 10.Chain(a => a + 20).Chain(Console.WriteLine).Chain(a => a + 30).Chain(Console.WriteLine); これでコンソールに 30 と60 が表示されます。 見ての通り、文を式に変換しています。 また、Chain 内で Chain(a => a switch { 10 => "Foo", _ => "Bar" }) のようにスイッチ式を使うこともできます。 これを使えば、何でも式に変換できるので重宝していますが、似たような形でモナドを構成すれば戻り値については解決するんじゃないかと思いました。
guest

回答1

0

自己解決

コメントで今のところ不可能ということを教えていただきました。
ありがとうござしました。

投稿2020/04/22 02:32

YamakawaJunichi

総合スコア632

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問