繁体   English   中英

此C#代码有什么问题?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM