我的问题,我不知道答案的标题,即:
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;
}
}
}
答案 0 :(得分:3)
但是,namespace-member-declarations是可选的~~因此,编译器应该允许初始{。
不,这不是可选的意思 - 它意味着“没有必须”,而不是“你可以拥有任何你喜欢的东西”。
基本上,编译单元由您提到的指令,全局属性和成员声明组成。这一切都可以出现在顶层。块不是成员声明(或全局属性或指令),因此不能出现在顶层。
这是另一个提示:
一个块允许在允许单个语句的上下文中写入多个语句。
顶级也不允许使用单个语句。这不是有效的代码:
using System;
Console.WriteLine("Nope, can't have a statement here.");
同样,它不遵循语法 - 它不是成员声明。
最后,即使在顶层允许 块,也必须更改它们以使代码有效 - 因为你试图在块中声明一个类,无效。