c# core github - if文の中で変数を定義できないのはなぜですか?



2 Answers

これは、ステートメントと式の違いと関係があります。 式は値を持ちますが、文は値を持ちません。

例を使用して、次の分類に注意してください。

StringBuilder sb; // statement

sb = new StringBuilder("test") // expression

StringBuilder sb = new StringBuilder("test"); // statement

中央の部分だけが式であることに注意してください。

これで条件文に移ります。 not-equals演算子の構文は次のとおりです。

expression != expression

だから両方の側で!=あなたは実際に価値があるものが必要です(これはちょっと意味があります)。 Ergo、演算子のどちらの側にも文を書くことはできません。 これは、あなたのコードの1つのバージョンが動作するのに対し、他のバージョンは動作しない理由です。

dotnet corefx proposal

たぶん、この質問はこれまでに答えられているかもしれませんが、 ifという言葉は頻繁に出てきて見つけにくいです。

この例は意味をなさない(式は常に真です)が、私の質問を示しています。

なぜこのコードは有効です:

StringBuilder sb;
if ((sb = new StringBuilder("test")) != null) {
    Console.WriteLine(sb);
}

しかし、このコードではありません:

if ((StringBuilder sb = new StringBuilder("test")) != null) {
    Console.WriteLine(sb);
}

私はwhile文に関する同様の質問を見つけました。 ここで受け入れられる答えは、 whileステートメントでは、変数が各ループで定義されることを意味します。 しかし、 if文の例ではそうではありません。

それで、私たちはこれをすることが許されない理由は何ですか?




の代わりに:

if ((StringBuilder sb = new StringBuilder("test")) != null) {
    Console.WriteLine(sb);
}

次のように書くこともできます:

for (StringBuilder sb = new StringBuilder("test"); sb != null; sb = null) {
    Console.WriteLine(sb);
}

このforループは、変数がnullでない場合に1回実行されます。 ループの最後に、一時変数がnullに設定されます。 ループ条件はfalseと評価され、次のステートメントは閉じブレースが実行された後も継続されます。 最初に意図したif文とまったく同じです。






Related