C# c程序能否以';{';;如果没有,为什么没有?

C# c程序能否以';{';;如果没有,为什么没有?,c#,compilation,compiler-errors,specifications,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编译单元:“编

我不知道答案的问题在标题中有说明,即:

一个c#程序能以
{
开头吗?如果不能,为什么不能?

以下内容详细说明了我迄今为止的研究和思考过程:

注:参考“c语言规范5.0”
使用vs2015社区版编译的代码

根据§2.2.2词汇语法,这句话似乎暗示可以以
{
开头,因为
{
是一个标记:

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

§2.4标记包括标点符号,
{
是一个点符号[§2.4.5运算符和标点符号]

但是,§9.名称空间以“C#程序是使用名称空间组织的”开头

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

编制单位:

外部别名directivesopt使用directivesopt全局属性opt

名称空间成员声明

“程序的每个编译单元的命名空间成员声明将成员贡献给一个称为全局命名空间的声明空间”

这包括:

class Program
{
    static void Main(string[] args)
    {
    }
}
这不会编译:

因此,尽管
{
是一个标记,但它不提供成员…这可能就是编译器拒绝开头
{
的原因

但是,名称空间成员声明是可选的~~因此,编译器可能应该允许初始的
{

这是一个街区:

并非每个块都必须是某物块,请参见下面的最后一个示例

§1.5声明

“块允许在允许一条语句的上下文中编写多条语句。
块由写在分隔符
{
}
之间的语句列表组成

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

class Program
{
    static void Main(string[] args)
    {
        {
            System.Int16 integer = System.Int16.MaxValue;
        }
        {
            System.Int32 integer = System.Int32.MaxValue;
        }
    }
}
但是,名称空间成员声明是可选的~~因此,编译器可能应该允许初始{

不,这不是可选的意思——它的意思是“不必有一个”,而不是“你可以拥有你喜欢的任何东西”

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

这里还有一个提示:

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

顶层也不允许使用单个语句。这是无效代码:

using System;

Console.WriteLine("Nope, can't have a statement here.");
同样,它没有遵循语法-它不是一个成员声明


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

您的问题中没有提出任何问题-仅在标题中。如果您想发布一个自我回答的问题,您必须将答案发布为answer,不在问题主体中。更新线程或删除它,因为现在,我看不到你的标题。我真的很想看看你在哪里更新。我将此文件归档在“无用”下@JK我编辑了问题主体以回应你的上述评论;标题是我的问题;主体是我到目前为止的分析;我是塔克:在这一点上,因此我发布了上面的问题。担心一个无用的“{”不会“希望加深我对c#”的理解。谢谢你,乔恩;非常感谢;对我来说,浏览“c#语言规范5.0”是令人兴奋的,尽管我希望它具有你的整体清晰性。
B-
class Program
{
    static void Main(string[] args)
    {
        {
            System.Int16 integer = System.Int16.MaxValue;
        }
        {
            System.Int32 integer = System.Int32.MaxValue;
        }
    }
}
using System;

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