当我浏览 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>();
}
}
最佳答案
确实看起来规范中可能存在错误。
解析表达式的方式
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? ')'
等等。
但事实并非如此。
关于c# - C# 语言规范 4.0 中是否正确定义了基本访问权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19029373/