为什么只有一个语句需要括号?
-
14-11-2019 - |
题
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#。
不隶属于 StackOverflow