代码之家  ›  专栏  ›  技术社区  ›  Sergio Tapia

这个C代码有什么问题?

  •  0
  • Sergio Tapia  · 技术社区  · 14 年前
    public bool IsValid()
    {
        get { return (GetRuleViolations().Count() == 0); }
    }
    

    我得到这个错误:

    ; 预期

    怎么了?

    我将遵循以下教程: http://nerddinnerbook.s3.amazonaws.com/Part3.htm 我不知道他们为什么用get。

    4 回复  |  直到 14 年前
        1
  •  18
  •   Tim Goodman    14 年前

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

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

    或者,如果有效 一个方法,它可以是这样的:

    public bool IsValid()
    {
        return (GetRuleViolations().Count() == 0);
    }
    
        2
  •  14
  •   Eric Lippert    14 年前

    这是一个有趣的案例,错误报告启发式方法会出错。这里发生的事情是编译器看到的

    public bool IsValid() 
    { 
    

    然后它看到

    get 
    

    一个有趣的事实: . (我讨论这个事实 here

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

    get myGet = new get();
    

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

    get();
    

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

    get++;
    

    它可以是一个标签语句的标签。

    get: M();
    

    get.M();
    

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

    get = null;
    

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

    get += M;
    

    我肯定有十几个案子我失踪了。我的观点是,它可能是任何这些东西。编译器将查看下一个标记,试图找出这几十种情况中,我们实际上处于哪种情况。编译器实际看到的是

    get {
    

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

        3
  •  2
  •   James Curran    14 年前

    应写为:

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

    没有 () 在第一行。你会注意到

        4
  •  2
  •   Jay    14 年前

    IsValid 必须是属性或方法。

    () 之后 是否有效 扔掉那些垃圾 get 如果要将其作为属性,请删除 ()