我正在研究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.I和base[E]它们的编写方式完全相同,((B)this).I并且((B)this)[E]在哪里B是构造发生的类或结构的基类.因此,base.I与base[E]对应于this.I和this[E],除了this被视为基类的一个实例.
如果没有附加的type-argument-list opt,我认为你现有的表达式不会解析.
这实际上是在第4版ECMA-334规范中正确指定的; 我将它作为C#规范的一个错误提出(并确保它不会因为第5版而被破坏).
| 归档时间: |
|
| 查看次数: |
307 次 |
| 最近记录: |