Net 2.0のC#で同一名の変数を使う場合について質問いたします。
以下のHoge1の場合には「 ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られます。
一方、Hoge2の場合には怒られません。
Hoge2内でx=1;ではなくint x=1;と再宣言しているにもかかわらず怒られないのは、Hoge1が厳格にスコープ管理している点からみると意外に感じられます。
http://www.atmarkit.co.jp/ait/articles/0210/16/n … の記述を見ると、この記事が書かれた2002年ごろにはHoge2もNGだったような印象を受けるのですが、変化があったのでしょうか?
この辺りの事情に詳しい方がおられましたらよろしく、お願い申し上げます。
class Class1
{
private void Hoge1()
{
int x;
{
int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られる。
}
}
int x;
private static void Hoge2()
{
int x=1; //これはOK!親にぶらさげた変数が通る。
}
}
No.2ベストアンサー
- 回答日時:
>変化があったのでしょうか?
質問文で掲示されているページの記事と、質問者さんの例(ほげ1ほげ2)は、表記は違えど「同じ事を言っている」ように見えるんですが。
「何も変わってない」と思いますが、どうでしょう?
ご回答ありがとうございます。
//http://www.atmarkit.co.jp/ait/articles/0210/16/n … からのコピペ改変(xをyに変更)
private static int y = 0;
static void sample1()
{
int y = 2; // ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。
}
上記を、VisualStudio2012でコピペで動かしてもやはりエラーが発生しないのであります......
------------------------------------------------------------------
その後、自分でも検討した結果、以下のことが分かったので後学のために記述します。
public class Class1
{
private void Hoge1()
{
int x;
{
int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」といわれる。
}
}
int x;
private void Hoge2()
{
int x = 1; //このぶらさげ変数はOK!
}
(1)Hoge2の{ }内のint x = 1;のxは{ }内のみにスコープを持つローカル変数として宣言されており、親のint x;とは無関係でスコープは及んでいない。→これは理解できる仕様である。
(2)ところが、Hoge2の{ }内のint x = 1;実行直後、親のint xにマウスをホーバーさせて内容をクイックウォッチすると1がはいってる(ように見えるため)、スコープが親のint xに通ってる(ように見える)!!→「え’’~、おかっしいなぁ」と感じる。
(3)これは、クイックウォッチが変数名のみで判断して中身表示してるためのようで、イミディエイトウインドウでClass1.xをみるとnullのままである。したがって、Hoge2の{ }内のローカル変数xのスコープは、親のxに及んでいないことがわかる。
------------------------------------------------------------------
上記より、
a)クイックウォッチの仕様にやや問題があるのでは?
b)昔の文法のほうが厳格で、親にぶら下げたglobal的変数名をローカルで宣言してまったときに気づきやすい。よって、今の文法でも「ローカルの変数 'x' をこのスコープで宣言することはできるが、'親またはカレント' スコープでも同一名で宣言されてるが、わかってるんだろうな!」くらいの警告がほしい。
No.1
- 回答日時:
詳しいって訳ではありませんが……。
# ということで、正しい内容についてはもっと詳しい方の回答待ちになりますかな。
>int x = 2; // これはNG!。
エラーで書かれているように、Hoge1()直下でのローカル変数なのか、その下に作ったローカルなブロック内での変数なのか判別する手段がない(あるいは煩雑過ぎる)ので駄目なのでしょう。
>int x=1; //これはOK!親にぶらさげた変数が通る。
静的メソッドから、非静的クラスフィールド(int x;)へのアクセスはできませんから判別できない。という状況にはならないのでしょう。
参考URL:http://ufcpp.net/study/csharp/oo_static.html
ご回答ありがとうございます。
int x;
private void Hoge2()
{
int x = 1; //このぶらさげ変数はOK!
}
とstaticをはずしても、相変わらず//ぶらさげ変数はOK!となる模様であります。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
『μg』の読み方と意味。
-
名古屋の栄と錦は治安悪い?
-
NumericUpDownの数値を選択済み...
-
フォームを開く時のイベント処理
-
項目数は英語で
-
クラッシュダンプが発生した時...
-
受け取った値が"undefined"と表...
-
メモリリーク対策
-
ティップネスの選曲について
-
ブック開いたときのフォーカス指定
-
エアー漏れの流量の計算式を教...
-
フリップフロップについての質...
-
MDIの子フォームでフォーカスア...
-
word
-
数式中の文字をCambria Math以...
-
イラレでダブルクリックで文字...
-
illustratorとExcelは連携出来...
-
PowerPoint SmartArtの箇条書...
-
PDF→CSVへ変換
-
Google マップに同心円と文字を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
名古屋の栄と錦は治安悪い?
-
『μg』の読み方と意味。
-
NumericUpDownの数値を選択済み...
-
テキストボックスからフォーカ...
-
VB.NETのテキストボック...
-
エアー漏れの流量の計算式を教...
-
VB.NET でのLaod/unLoad につ...
-
フォームを開く時のイベント処理
-
vba メモリーリーク
-
項目数は英語で
-
シリアルフラッシュメモリをな...
-
TextBoxにカーソルがあるかない...
-
ヒント表示について
-
mailの送信音がしなくなったの...
-
ブック開いたときのフォーカス指定
-
VBのレコードセットを閉じない...
-
コンピュータ言語paythonのエデ...
-
vc++2005エラーメッセージ
-
C言語の関数の実引数と仮引数の...
-
globalと$GLOBALSの違いは?
おすすめ情報