是否在C#语言规范4.0中正确定义了基本访问权限?

时间:2013-09-26 13:16:10

标签: c# grammar language-lawyer

当我查看C# Language Specification v4.0时,我注意到有一组规则被定义为:

invocationExpression:
    primaryExpression '(' argumentList? ')'

primary-expression: 
    primary-no-array-creation-expression
    array-creation-expression

primary-no-array-creation-expression:
    literal
    simple-name
    parenthesized-expression
    member-access
    invocation-expression
    element-access
    this-access
    base-access
    post-increment-expression
    post-decrement-expression
    object-creation-expression
    delegate-creation-expression
    anonymous-object-creation-expression
    typeof-expression
    checked-expression
    unchecked-expression 
    default-value-expression
    anonymous-method-expression

base-access:
    'base'   '.'   identifier
    'base'   '['   argument-list   ']'

当我试图匹配这个陈述时(顺便说一下,这是正确的陈述,我看过它在项目中使用过)

base.VisitList<T>(list, visitor);

根据给定的规则,我没有看到如何做到这一点。不应将base-access定义为:

 base-access:
        'base'   '.'   identifier type-parameter-list(opt)
        'base'   '['   argument-list   ']'

或类似的东西,语法能够捕获语句吗?

编辑我看到的示例是项目db4o的C#版本,它是这样的(我删除了大部分声明,只留下了重要的声明)

internal abstract class ExpressionVisitor
{
    protected virtual void VisitList<T>()
    {
    }
}

internal class HashCodeCalculation : ExpressionVisitor
{
    protected override void VisitList<T>()
    {
        base.VisitList<T>();
    }
}

3 个答案:

答案 0 :(得分:5)

确实看起来规范中可能存在错误。

解析表达式的方法

this.VisitList<T>(list, visitor)

如下:

invocation-expression

primary-expression '(' argumentList? ')'

primary-no-array-creation-expression '(' argumentList? ')'

member-access '(' argumentList? ')'

primary-expression '.' identifier type-argument-listopt '(' argumentList? ')'

this-access '.' identifier type-argument-listopt '(' argumentList? ')'

'this' '.' identifier type-argument-listopt '(' argumentList? ')'

等等。

换句话说,this-access被定义为

this-access:
    'this'

如果将base-access定义为

,那将会很有意义
base-access:
    'base'

然后解析表达式的方法

base.VisitList<T>(list, visitor)

如下:

invocation-expression

primary-expression '(' argumentList? ')'

primary-no-array-creation-expression '(' argumentList? ')'

member-access '(' argumentList? ')'

primary-expression '.' identifier type-argument-listopt '(' argumentList? ')'

base-access '.' identifier type-argument-listopt '(' argumentList? ')'

'base' '.' identifier type-argument-listopt '(' argumentList? ')'

等等。

但事实并非如此。

答案 1 :(得分:1)

我怀疑这是非常有效的C#代码。也许你用C ++看过它?

以下代码无法使用语法错误进行编译:

public class VisitList<T> : List<T>
{
    public VisitList(int n)
        : base.VisitList<T>(n)
    {

    }
}

这有效:

public class VisitList<T> : List<T>
{
    public VisitList(int n)
        : base(n)
    {

    }
}

答案 2 :(得分:0)

Standard ECMA-334 5th Edition / December 2017 C# Language Specification

第12.7.9节“基本访问权限”,第151页

它现在显示为:

0: /usr/local/bin/node
1: /Users/tzp/xxx/vue-cli-service
2: build
3: a=b
4: foo

由于更改了此内容,因此似乎可以肯定第四版确实存在缺陷或遗漏。