当我查看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>();
}
}
答案 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
由于更改了此内容,因此似乎可以肯定第四版确实存在缺陷或遗漏。