C# 这个C代码怎么了?

C# 这个C代码怎么了?,c#,methods,C#,Methods,我得到了这个错误: );期望 怎么了 我将遵循本教程: 我不知道他们为什么要使用get。您不需要在IsValid后面加括号,因为它是一个属性而不是一个方法(大概是因为您使用的是getter) 这样写: public bool IsValid() { get { return (GetRuleViolations().Count() == 0); } } public bool IsValid { get { return (GetRuleViolations().Count()

我得到了这个错误:

);期望

怎么了

我将遵循本教程:
我不知道他们为什么要使用get。

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

这样写:

public bool IsValid()
{
    get { return (GetRuleViolations().Count() == 0); }
}
public bool IsValid
{
    get { return (GetRuleViolations().Count() == 0); }
}
或者,如果IsValid是一个方法,它可以如下所示:

public bool IsValid()
{
    get { return (GetRuleViolations().Count() == 0); }
}
public bool IsValid
{
    get { return (GetRuleViolations().Count() == 0); }
}

应写为:

public bool IsValid()
{
    return (GetRuleViolations().Count() == 0);
}

没有第一行的
()
。您会注意到它在您引用的网页上是正确的。

是有效的
必须是属性或方法

如果您希望它成为一种方法,请将
()
放在
IsValid
之后,并放弃
get

如果希望它成为一个属性,请删除
()

这是一个有趣的案例,错误报告启发法将其弄错。这里发生的事情是编译器看到的

public bool IsValid
{ 
    get { return (GetRuleViolations().Count() == 0); } 
} 
然后对自己说:“啊哈,这里有一个名为IsValid的公共方法,它不接受任何参数并返回bool。我将把它之后的所有内容作为方法体块中的语句列表进行处理

然后它看到

public bool IsValid() 
{ 
一个有趣的事实:get不是C#的保留字(我讨论这个事实)

因此编译器现在认为这是一个以标识符“get”开头的语句。该语句可能是什么?它可能是一个局部变量声明:

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

get myGet = new get();
它可以是名为get的字段的增量或减量

get();
它可以是带标签语句的标签

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

get: M();
它可以是对字段的赋值:

get.M();
它可以是一个事件加法器:

get = null;
我确信我遗漏了十几个案例。我的观点是,可能是其中的任何一个。编译器将查看下一个标记,试图找出这几十个案例中的哪一个。然后编译器实际看到的是

get += M;
它的理由是“嗯,那太糟糕了。这是那里新街区的开始。我知道在标识符get之后和新块开始之前必须有一些东西,但我不知道它是什么。它可能是一个冒号,一个点,一个加号。。。我不知道,它几乎可以是任何东西。有什么我知道的吗?对我知道,至少,在以get开头的语句的结尾和它后面的块的开头之间必须有一个分号。因此,我将报告“缺少分号”错误,因为这是我目前所能做的最好的了。”


我们可以做的是特殊情况下的情况“get是方法块中可能是属性的第一件事,后面紧跟着一个左大括号”,然后报告一个特殊错误,在这种情况下,“嘿,看起来你正在尝试编写一个带参数的属性“。但显然,我们在设计错误启发法时没有考虑到这种情况。这是一个很好的例子,所以我们可能会在未来版本的编译器中这样做。

哦!我现在明白了,它只是Area类的一个属性。@Sergio Tapia-它是一个属性,不是属性。属性在C#中有所不同。如果您使用错误消息“嘿,看起来您正在尝试编写属性”,则必须添加一个会说话的回形针,提供一些帮助:P