[英]What is wrong with this C# code?
public bool IsValid()
{
get { return (GetRuleViolations().Count() == 0); }
}
我收到此错误:
; 预期
怎么了?
我正在关注本教程: http : //nerddinnerbook.s3.amazonaws.com/Part3.htm我不确定他们为什么使用get。
IsValid之后不需要括号,因为它是属性而不是方法(大概是因为您正在使用吸气剂)
像这样写:
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
另外,如果IsValid 是一种方法,它可能看起来像这样:
public bool IsValid()
{
return (GetRuleViolations().Count() == 0);
}
这是一个有趣的案例,其中错误报告启发式方法将其弄错了。 这里发生的是编译器看到的
public bool IsValid()
{
并自言自语“啊哈,这里我们有一个名为IsValid的公共方法,该方法不带任何参数并返回bool。我将其后的所有内容作为方法体块中的语句列表进行处理。
然后看到
get
一个有趣的事实: get不是C#的保留字 。 (我在这里讨论这个事实。)
因此,此时的编译器现在认为这是一条以标识符“ get”开头的语句。 那句话可能是什么? 它可以是局部变量声明:
get myGet = new get();
它可以是方法或委托调用:
get();
它可以是名为get的字段的增减。
get++;
它可以是带有标签的语句的标签。
get: M();
它可能是方法调用的接收者:
get.M();
它可能是对字段的分配:
get = null;
可能是事件加法器:
get += M;
而且我敢肯定我有十几个案件不见了。 我的观点是,可能是其中任何一种。 编译器将查看下一个标记,以尝试找出我们实际处于的数十种情况中的哪一种。然后,编译器实际看到的是
get {
并且它的原因是“嗯,那很糟糕。那是在那里新块的开始。我知道在标识符获取之后和新块开始之前一定有东西 ,但是我不知道它是什么。可能是一个冒号,一个点,一个加号...我不知道,它几乎可以是任何东西,我有什么知道的吗?是的,我知道,至少必须有一个分号在以get开头的语句的末尾和它后面的语句块的开始之间 。因此,我将报告“缺少分号”错误,因为这是我此时能做的最好的事情。
我们可以做的是特殊情况:“获取是方法块中的第一件事,它可能是一个属性,并且紧随其后是左花括号”,然后在这种情况下报告特殊错误“嘿,它似乎您正在尝试编写一个带有参数的属性”。 但是很显然,在设计错误启发式算法时我们没有想到这种情况。 那是一个很好的选择,所以也许我们会在假定的编译器未来版本中做到这一点。
那应该写成:
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
第一行中没有()
。 您会注意到在您引用的网页上它是正确的。
IsValid
必须是属性或方法。
如果希望将其用作方法,请在IsValid
之后保留()
并放弃get
。 如果要使其成为属性,请删除()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.