3

存在するために変数を if ステートメントのスコープ外で宣言しなければならないのはなぜですか?

たとえば、次のコードはコンパイルされません。

DateTime? myDate;
if (myDate != null)
{
    DateTime runDate = DateTime.Now;
}
else
{
    DateTime runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();

問題は if ステートメントの前に宣言する必要があることだと理解していますrunDateが、なぜですか? コンパイラがこのコードの一部を機能させた場合、以前に宣言した場合と実際に違いはありますか? または、もっといい言い方をすれば、言語/フレームワークに取り組んだ開発者はなぜこのようにすることにしたのですか?

4

7 に答える 7

15

さて、あなたの例から派生したこれを考えてみましょう:

DateTime? myDate;
if (myDate != null)
{
    String runDate = DateTime.Now.ToString();
}
else
{
    DateTime runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.ToString();

あなたの提案に従って、runDatefooが割り当てられたとき)のタイプはコンパイル時に不明stringですDateTime。これは、静的に型付けされた言語では許可されていません。

于 2013-07-26T19:46:15.120 に答える
3

変数は、宣言されているスコープの外には存在しません。

あなたの場合、変数 runDate は if ステートメント内で作成されるため、外部では使用できません。

これは許されるだろう

DateTime? myDate;
DateTime runDate;
if (myDate != null)
{
     runDate = DateTime.Now;
}
else
{
    runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();
于 2013-07-26T19:45:36.090 に答える
1

他の人が言ったように-それはC#のローカルの定義の一部です:

http://blogs.msdn.com/b/ericlippert/archive/2012/01/16/what-is-the-defining-characteristic-of-a-local-variable.aspx

于 2013-07-26T19:47:34.467 に答える
0

DateTime runDateコンパイラの両側で宣言されていても、if深い分析を実行してコンパイラが実行していないことを確認しない限り、それを知ることはできません。また、 内で宣言すると、 のスコープ内でif宣言しているため、メソッドのスコープ外で宣言されます。ifメソッド内で何かを使用する場合は、メソッドのスコープ内で宣言し、 内で使用する必要がありますif

DateTime? myDate ;
DateTime runDate ;

if (myDate != null)
{
    runDate = DateTime.Now;
}
else
{
    runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();
于 2013-07-26T19:44:44.850 に答える
0

C# の変数は、そのブロック内でのみ有効だからです。if ステートメント内で runDate 変数を作成しようとすることに問題はありません。失敗したのは、そのブロックの外側で runDate 変数を使用しようとしたことです。

宣言は、それが使用される最も外側のブロックにある必要があります。もちろん、runDate.ToString() を if ステートメント内に移動することもできます。そう選択した場合は、コンパイルされます。

于 2013-07-26T19:45:34.250 に答える
0

ブロックスコープのため。コンパイラーが作業するのはずっと簡単で、より論理的でもあります。各ブロック (開き括弧と閉じ括弧のセット) には、その内部でのみスコープ内にあるローカル変数と、サブブロックがあります。これは理にかなっており、人々が狂気に陥るのを防ぎます。

于 2013-07-26T19:47:07.853 に答える