C#のパターンマッチング内での変数の宣言について質問があります。 以下のようなコードですが、if文が成立しなければnumberという変数は何の意味もないはずなのに、if文の外でもなぜか有効です。この挙動は仕様のようだが、非常に煩わしく、エラーの原因にもなっています。 if (obj is int number) { // ここではnumberは有効 } // ここでもnumberは有効 パターンマッチング内での変数の宣言について、チームで働く方々はどのようなルールを設けているのでしょうか? ご回答いただけると助かります。よろしくお願いします。

C言語関連59閲覧xmlns="http://www.w3.org/2000/svg">25

ベストアンサー

この回答はいかがでしたか? リアクションしてみよう

変数には宣言されたブロックの外からアクセスできず、ブロックは中カッコで囲まれた範囲です。 質問のケースではnumberが宣言されているブロックと使用されるブロックは同じなので問題なく使用できます。 むしろfor(int i=0;i<10;i++){//iが使えるのはこのブロック内だけ}の方が特殊です。 これはパターンマッチングではなくifとforの違いと把握してください。 同じことはパターンマッチングを使わなくても変数宣言することで起こります。 var dic=new Dictionary<int,int>(); if (dic.TryGetValue(0, out int i)) { //iが使える } //iが使える

ThanksImg質問者からのお礼コメント

確かに!! if文もfor文も()の中はまだスコープの外!! outもスコープの外だから外で使える!! 頭の中でスコープの境界が曖昧になってました。 勉強になりました、ありがとうございます。

お礼日時:2024/12/20 8:08

その他の回答(1件)

スコープが問題なら下記のように中カッコで囲んでスコープを限定されてはどうですか? { if (obj is int number) { // ここではnumberは有効 } } // ここではnumberは無効のはず

>if文が成立しなければnumberという変数は何の意味もないはずなのに 仕様に詳しい訳ではありませんがif文を通過しているので、変数を普通に宣言したのと同じと思います。何の意味もないと考えるのが誤りでしょう。 bool SomeMethod(out int value){ } の呼び出し var a = SomeMethod(out int b); var c = b; はビルドエラーにはならない。 いずれにしても、動作が紛らわしいコードは書かないのが懸命です。