c#程序可以以'{'开头吗?如果没有,为什么不呢?

时间:2016-04-12 03:01:52

标签: c# compilation compiler-errors specifications

我的问题,我不知道答案的标题,即:

c#程序可以以{开头;如果没有,为什么不呢?

以下所有内容详细介绍了我的研究和进展情况。到目前为止的思考过程:

注意:引用“ c#语言规范5.0 ”;
用vs2015社区版编译的代码。

从§2.2.2词汇语法来看,这句话似乎意味着可以从{开始,因为{是一个标记:

“C#程序中的每个源文件都必须符合词法语法的输入生成(§2.3)。”

§2.4标记包含标点符号{是标点符号[§2.4.5运算符和标点符号]

然而,§9。命名空间开始“使用命名空间组织C#程序。”

§9.1编译单元:“编译单元定义源文件的整体结构。”

编译单元:

extern-alias-directives opt using-directives opt global-attributes opt

命名空间成员声明选择

程序的每个编译单元的 namespace-member-declarations 将成员提供给称为全局命名空间“<的单个声明空间/ p>

编译:

class Program
{
    static void Main(string[] args)
    {
    }
}

编译:

{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

所以,尽管{是一个令牌,但它没有提供成员......这可能是编译器拒绝开头{的原因。

但是, namespace-member-declarations 是可选的~~因此,或许编译器应该允许初始{

这是

{
}

并非每个都必须是 something-block ,请参阅下面的最后一个示例。

§1.5语句

允许在允许单个语句的上下文中写入多个语句。
块包含在分隔符{}之间写入的语句列表。“

另一个使用块进行范围编译的示例:

class Program
{
    static void Main(string[] args)
    {
        {
            System.Int16 integer = System.Int16.MaxValue;
        }
        {
            System.Int32 integer = System.Int32.MaxValue;
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

但是,namespace-member-declarations是可选的~~因此,编译器应该允许初始{。

不,这不是可选的意思 - 它意味着“没有必须”,而不是“你可以拥有任何你喜欢的东西”。

基本上,编译单元由您提到的指令,全局属性和成员声明组成。这一切都可以出现在顶层。块是成员声明(或全局属性或指令),因此不能出现在顶层。

这是另一个提示:

  

一个块允许在允许单个语句的上下文中写入多个语句

顶级也不允许使用单个语句。这不是有效的代码:

using System;

Console.WriteLine("Nope, can't have a statement here.");

同样,它不遵循语法 - 它不是成员声明。

最后,即使在顶层允许 块,也必须更改它们以使代码有效 - 因为你试图在块中声明一个类,无效。