这个C#代码有什么问题?

Ser*_*pia 0 c# methods

public bool IsValid()
{
    get { return (GetRuleViolations().Count() == 0); }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

; 预期

怎么了?

我正在学习本教程:http://nerddinnerbook.s3.amazonaws.com/Part3.htm 我不确定他们为什么使用get.

Tim*_*man 18

在IsValid之后你不需要括号,因为它是一个属性而不是一个方法(大概是因为你使用的是getter)

写这样:

public bool IsValid
{
    get { return (GetRuleViolations().Count() == 0); }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果IsValid 一个方法,它可能看起来像这样:

public bool IsValid()
{
    return (GetRuleViolations().Count() == 0);
}
Run Code Online (Sandbox Code Playgroud)

  • @Sergio Tapia - 这是一个属性,而不是属性.属性在C#中是不同的. (2认同)

Eri*_*ert 14

这是一个有趣的案例,其中错误报告启发式错误.这里发生的是编译器看到的

public bool IsValid() 
{ 
Run Code Online (Sandbox Code Playgroud)

并且对自己说"啊哈,这里我们有一个名为IsValid的公共方法,它不带参数并返回bool.我将把它后面的所有内容处理为方法体块中的语句列表.

然后它看到了

get 
Run Code Online (Sandbox Code Playgroud)

一个有趣的事实:get不是C#的保留字.(我在这里讨论这个事实.)

所以此时编译器现在认为这是一个以标识符"get"开头的语句.这个陈述可能是什么?它可以是局部变量声明:

get myGet = new get();
Run Code Online (Sandbox Code Playgroud)

它可以是方法或委托调用:

get();
Run Code Online (Sandbox Code Playgroud)

它可以是名为get的字段的增量或减量.

get++;
Run Code Online (Sandbox Code Playgroud)

它可以是带标签的声明的标签.

get: M();
Run Code Online (Sandbox Code Playgroud)

它可能是方法调用的接收者:

get.M();
Run Code Online (Sandbox Code Playgroud)

它可能是一个字段的赋值:

get = null;
Run Code Online (Sandbox Code Playgroud)

它可能是一个事件加法器:

get += M;
Run Code Online (Sandbox Code Playgroud)

而且我确信有十几个案例我都不见了.我的观点是它可能是任何一件事.编译器将查看下一个令牌以尝试找出我们实际所处的几十个案例中的哪一个.然后编译器实际看到的是

get {
Run Code Online (Sandbox Code Playgroud)

它的原因是"嗯,这很糟糕.那是一个新区块的开始.我知道在标识符获取之后和新区块开始之前必须有一些东西,但我不知道它是什么.它可能是一个冒号,一个点,一个加号...我不知道,它几乎可以是任何东西.有什么我知道吗?是的.我知道至少,总是必须有一个分号在以get开头的语句的结尾和跟随它的块的开头之间.因此我将报告"缺少分号"错误,因为这是我现在能做的最好的事情."

我们可以做的是特殊情况"get是方法块中的第一个可能是属性的东西,紧接着是左大括号"然后在那种情况下报告一个特殊错误"嘿,它看起来你正试图写一个带参数的属性".但显然我们在设计错误启发式时没有想到这种情况.这是一个很好的,所以也许我们会在假设的未来版本的编译器中这样做.

  • 如果您使用错误消息"嘿,看起来您正在尝试编写属性",那么您必须添加一个会说话的Paperclip提供一些帮助:P (4认同)