0

理解できないように見える簡単な質問があります。

これが有効な c# である理由:

if (node != null)
{
     string fullAddress = node.InnerText;
}

そして、これはそうではありませんか?

if (node != null)
     string fullAddress = node.InnerText;

これはコンパイラのバグですか、それとも意図したものですか?

4

5 に答える 5

2

これは予想される動作であり、1 つのステートメントを使用することを覚えていれば意味があります。ifしたがって、そのような構文が許可されている場合、変数宣言のスコープは宣言された直後に終了します。

C# 5.0 仕様のセクション 8.5 (リンクを提供してくれた Rob Harvey に感謝) で説明されている詳細と、セクション B.2.5 の文法:

セクション 8.5:

宣言ステートメントは、ローカル変数または定数を宣言します。宣言ステートメントはブロックで許可されていますが、埋め込みステートメントとしては許可されていません。

セクション B.2.5 の文法:

statement:
  labeled-statement
  declaration-statement
  embedded-statement

embedded-statement:
  block 
  ...

if-statement:
   if   (   boolean-expression   )   embedded-statement

ご覧のとおり、変数宣言 ( declaration-statement) はそうではないembedded-statementため、 では使用できませんif-statement

C# 仕様の場所に関する注意:

  • 古いバージョンは、MSDN でオンラインで見つけることができます (つまり、前述のAnirudh answerのセクション 8.5 )。
  • 最新版は VS のインストールに付属しており、通常は「Program Files (x86)\Microsoft Visual Studio 11.0\VC#\Specifications\1033\CSharp Language Specification.docx」フォルダーにあります。C# 5 言語仕様はどこで入手できますか?も参照してください。
于 2013-07-10T16:35:20.057 に答える
0
if (node != null)
  string fullAddress = node.InnerText;

これは、角かっこを使用する必要のない Visual Basic スタイルのコード記述です。また、C# では、括弧を指定しないと、1 行のステートメントしか実行されません。ただし、さらに複数行のコードを実行する必要がある場合は、ブラケットを使用する必要があります。

于 2013-07-10T16:47:01.177 に答える