public void Finalise()
    ProcessFinalisation(true);
.

不编译,但正确的版本:

public void Finalise()
{
    ProcessFinalisation(true);
}
.

编译罚款(当然)。

如果在以下代码只有一行时,如果我允许的如果没有括号:

if(true)
    CallMethod();
.

为什么不允许使用以下一行的方法?有技术原因吗?

有帮助吗?

解决方案

自C#6.0您可以声明:

void WriteToConsole(string word) => Console.WriteLine(word)
.

然后像往常一样称呼它:

public static void Main()
{
    var word = "Hello World!";
    WriteToConsole(word);
}
.

其他提示

显而易见的答案是语言规范;出于推理......我猜主要是简单性 - 它不值得过度的开销 - 检查 小小的单个语句方法的规格和编译器。特别是,我可以潜在地看到具有通用约束等的问题(即签名结束时的生成频率agdode)。

请注意,不使用牙套有时会导致含糊不清,在某些地方令人沮丧。我比个人更务实,但每个人都是自己的。

它也可能感兴趣的是,C#内部剃刀 不允许没有显式大括号的 用法。完全(即使是where T : IBlah, new()等)。

Marc基本上是对的。要在答案中扩展一下:C#需要许多地方,而不是允许“裸体”声明。它们是:

  • 方法,构造函数,析构函数,属性访问器,事件访问器或索引器访问器的主体。
  • 尝试,捕获,最后,检查,未选中或不安全区域的块。
  • 语句λ或匿名方法的块
  • 如果块直接包含本地变量声明,则IF或循环语句的块。 (即“(x!= 10)int y= 123;”是非法的;你必须支撑声明。)

    在这些情况中的每一个中,有可能有一个明确的语法(或启发式歧视歧义语法),为单一的禁区陈述是合法的特征。但这一点是什么?在您期望看到多个陈述的每个情况下;单一陈述是罕见的,不太可能的情况。这似乎并不值得它值得让语法毫不含糊,为这些非常不太可能的情况。

简短答案:C#在C之后风格,C授权函数被支撑,因为函数声明如何。

具有历史记录的长版本:返回K&R C,函数被声明如下:

int function(arg1, arg2)
int arg1;
int arg2;
{ code }
.

当然,您无法在该安排中具有杂乱的功能。ANSI C授权我们所有人所知道和爱的语法:

int function(int arg1, int arg2)
{ code }
.

但没有允许unbraced函数,因为它们会导致与旧的编译器造成严重破坏,只知道K&R语法[仍然需要支持K&R声明]。

时间继续下去,多年来,C#围绕c [或c ++,同样的语法差异,因为c不允许unbraced函数,也没有c#。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top