gpt4 book ai didi

c# - 为什么 PreIncrement 类型的 PrefixUnaryExpressionSyntax 允许使用 ParanthesisedExpressionsSyntax 的操作数?

转载 作者:行者123 更新时间:2023-12-02 01:48:54 24 4
gpt4 key购买 nike

我试图了解 C# 分析器和编译器的工作原理。

根据文档,像 pre-inc 和 post-inc 这样的一元运算符应该只接受变量、属性和索引器。

有趣的是,它们也接受 ParanthesisedExpressions,例如代码++(x);

这有语法原因吗?除了 ParanthesizedExpressionSyntax 在语义上等同于属性/索引器/变量之外,是否还有++(..something here..) 起作用的其他情况?

最佳答案

这是因为C#语言规范允许。 preincrement operator的规范是:

pre_increment_expression
: '++' unary_expression
;

以及 unary_expression 的规范是:

unary_expression
: primary_expression
| null_conditional_expression
| '+' unary_expression
| '-' unary_expression
| '!' unary_expression
| '~' unary_expression
| pre_increment_expression
| pre_decrement_expression
| cast_expression
| await_expression
| unary_expression_unsafe
;

最后,primary_expression允许使用括号:

primary_expression
: primary_no_array_creation_expression
| array_creation_expression
;

primary_no_array_creation_expression
: literal
| interpolated_string_expression
| simple_name
| parenthesized_expression <<--- 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
| nameof_expression
| anonymous_method_expression
| primary_no_array_creation_expression_unsafe
;

现在的问题是:为什么 pre_increment_expression 应该允许 unary_expression?因为替代方案将更难指定、开发和测试。另一种选择是编写如下内容:

pre_increment_expression
: '++' pre_increment_expression_allowed
;

pre_increment_expression_allowed
: element_access
| member_access
| some other expressions
;

如果您不重用现有表达式,则必须考虑您想要允许的所有表达式,这可能会变得非常复杂,然后开发新的语法树解析来支持该表达式。

复杂的示例:

请注意,可以编写以下内容(虽然没有多大意义,但仍然如此):

void Main()
{
++(new MyClass().Prop);

}

public class MyClass
{
public int Prop {get;set;}
}

关于c# - 为什么 PreIncrement 类型的 PrefixUnaryExpressionSyntax 允许使用 ParanthesisedExpressionsSyntax 的操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70567574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com