代码之家  ›  专栏  ›  技术社区  ›  Anthony Pegram

if语句后面的变量声明

  •  59
  • Anthony Pegram  · 技术社区  · 16 年前

    另一个论坛上出现了一个问题,我知道如何解决它,但它揭示了编译器特有的一个特性。此人收到错误“Embedded statement cannot be a declaration or labeled statement”,因为他们在if语句后面有一个变量声明,没有括号。这不是他们的意图,但是他们注释掉了紧跟在if语句后面的代码行,这使得变量声明成为要执行的实际代码行。不管怎样,这就是背景,这让我想到了这一点。

    if (true)
        int i = 7;
    

    然而,如果你把它放在括号里,那就是合法的。

    if (true)
    {
        int i = 7;
    }
    

    这两段代码都没有用。但是第二个还可以。这种行为的具体解释是什么?

    4 回复  |  直到 13 年前
        1
  •  81
  •   Deduplicator    12 年前

    这个 C# language specification 区分三种类型的陈述(详见第8章)。一般来说,您可以使用以下语句:

    • -我猜这是给守旧派的 goto
    • -这将是一个变量声明
    • -包括了几乎所有剩下的陈述

    在 if 声明尸体必须 嵌入式语句 ,这就解释了为什么第一个版本的代码不起作用。以下是 如果 根据规范(第8.7.1节):

    如果( 布尔表达式 嵌入式语句
    如果( 布尔表达式 ) 嵌入式语句 其他的 嵌入式语句

    变量声明是 ,所以它不能出现在体内。如果将声明括在括号中,将得到一个语句块,这是一个 嵌入式语句

        2
  •  27
  •   Community Mohan Dere    9 年前

    this SO answer 关于名称解析:

    意思是“语言…编译器 如果设计是最好的,就大声抱怨

        3
  •  10
  •   JaredPar    16 年前

    所有的编译器都允许你编译无用的或使用率极低的代码。开发人员可以通过太多的方式使用这种语言来创建构造而没有任何用处。让编译器捕获所有这些代码实在是太费劲了,而且通常不值得这么做。

    第二种情况在第8.0节开头的C语言规范中直接调用

    示例代码

    void F(bool b) {
        if (b)
            int i = 44;
    }
    
        4
  •  0
  •   beerwin    10 年前

    在if的else部分添加右括号和左括号对我有帮助,就像我在下面所做的那样,而不是在添加它们之前所做的那样;

    之前: 这导致了错误:

    protected void btnAdd_Click(object sender, EventArgs e)
        {
            if (btnAdd.Text == "ADD")
            {
    
                CATEGORY cat = new CATEGORY
                {
    
                    NAME = tbxCategory.Text.Trim(),
                    TOTALSALEVALUE = tbxSaleValue.Text.Trim(),
                    PROFIT = tbxProfit.Text.Trim()
    
                };
                dm.AddCategory(cat, tbxCategory.Text.Trim());
            }
            else
            // missing brackets - this was causing the error
                var c = getCategory();
                c.NAME = tbxCategory.Text.Trim();
                c.TOTALSALEVALUE = tbxSaleValue.Text.Trim();
                c.PROFIT = tbxProfit.Text.Trim();
                dm.UpdateCategory(c);
    
            btnSearchCat_Click(btnSearchCat, e);
        }
    

    在else分支中添加了括号

    protected void btnAdd_Click(object sender, EventArgs e)
        {
            if (btnAdd.Text == "ADD")
            {
    
                CATEGORY cat = new CATEGORY
                {
    
                    NAME = tbxCategory.Text.Trim(),
                    TOTALSALEVALUE = tbxSaleValue.Text.Trim(),
                    PROFIT = tbxProfit.Text.Trim()
    
                };
                dm.AddCategory(cat, tbxCategory.Text.Trim());
            }
            else
            {
                var c = getCategory();
                c.NAME = tbxCategory.Text.Trim();
                c.TOTALSALEVALUE = tbxSaleValue.Text.Trim();
                c.PROFIT = tbxProfit.Text.Trim();
                dm.UpdateCategory(c);
            }
            btnSearchCat_Click(btnSearchCat, e);
        }