5

当我浏览时,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   ']'

或类似的东西以这种方式语法能够捕获语句?

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

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

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

3 回答 3

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? ')'

等等。

但事实并非如此。

于 2013-10-30T14:52:51.870 回答
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)
    {

    }
}
于 2013-10-30T13:32:32.750 回答
0

标准 ECMA-334第 5 版/2017 年 12 月 C# 语言规范中

第 12.7.9 节基本访问,第 151 页

现在内容如下:

base-access:
base . identifier type-argument-listopt
base [ argument-list ]

由于这已更改,这似乎是承认第 4 版确实存在缺陷或遗漏。

于 2019-02-18T12:46:28.630 回答