C#语法"基地"

Wic*_*koo 7 c# grammar

我正在研究C#5.0的语法,并不太了解"base"的用法.在参考手册中,有一个"基本访问"的概念定义为:

base-access:
    base   .   identifier
    base   [   expression-list   ]
Run Code Online (Sandbox Code Playgroud)

base关键字在哪里,似乎这是唯一的情况.但是,我遇到了C#等输入

base.WithAdditionalDiagnostics<TNode>(node, diagnostics);
Run Code Online (Sandbox Code Playgroud)

有人能指出我这个陈述所指的语法规则吗?由于'base'似乎是一个普通的关键字,而不是上下文,我假设对于这种情况应该有一个特定的语法规则,并且base不能简单地是一个标识符.

Jon*_*eet 11

我相信它应该

base-access:
    base   .   identifier type-argument-list_opt
    base   [   expression-list   ]
Run Code Online (Sandbox Code Playgroud)

...这会使它像成员访问:

member-access:
    primary-expression   .   identifier   type-argument-list_opt
    predefined-type   .   identifier   type-argument-list_opt
    qualified-alias-member   .   identifier   type-argument-list_opt
Run Code Online (Sandbox Code Playgroud)

换句话说,在表达式中

base.WithAdditionalDiagnostics<TNode>(node, diagnostics);
Run Code Online (Sandbox Code Playgroud)

只要

base.WithAdditionalDiagnostics<TNode>
Run Code Online (Sandbox Code Playgroud)

基本访问部分 - 其余部分被解析,就像其他调用一样x.WithAdditionalDiagnostics<TNode>(node, diagnostics).

从C#5规范的7.6.8节:

在绑定时,表单的基本访问表达式base.Ibase[E]它们的编写方式完全相同,((B)this).I并且((B)this)[E]在哪里B是构造发生的类或结构的基类.因此,base.Ibase[E]对应于this.Ithis[E],除了this被视为基类的一个实例.

如果没有附加的type-argument-list opt,我认为你现有的表达式不会解析.

这实际上是在第4版ECMA-334规范中正确指定的; 我将它作为C#规范的一个错误提出(并确保它不会因为第5版而被破坏).

  • @JeroenVannevel:不,那是我的相同规格 - 我说第一个选项中有一个错误. (2认同)