Paw*_*wel 1 c# object-initializers collection-initializer
我在初始化集合属性时注意到奇怪的行为。
考虑:
class X
{
public IList<int> Ints { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Ints我可以这样初始化:
var theObject = new X
{
Ints = { 12, 3, 4, 5, 6 }
};
Run Code Online (Sandbox Code Playgroud)
但我不能这样做:
var x = new X();
x.Ints = { 12, 3, 4, 5, 6 }
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?这似乎很不直观。
new X ...是对象创建表达式的开始。在这种表达式中,允许使用对象或集合初始值设定项:
object_creation_expression
: 'new' type '(' argument_list? ')' object_or_collection_initializer?
| 'new' type object_or_collection_initializer // <--- here!
;
object_or_collection_initializer
: object_initializer
| collection_initializer
;
Run Code Online (Sandbox Code Playgroud)
在您的代码中,您有一个对象初始化器 { Ints = ... }。其中,还有另一个集合初始化程序 { 12, 3, 4, 5, 6 }。根据语法,这是允许的:
object_initializer
: '{' member_initializer_list? '}'
| '{' member_initializer_list ',' '}'
;
member_initializer_list
: member_initializer (',' member_initializer)*
;
member_initializer
: initializer_target '=' initializer_value
;
initializer_target
: identifier
| '[' argument_list ']'
;
initializer_value
: expression
| object_or_collection_initializer // <---- here!
;
Run Code Online (Sandbox Code Playgroud)
Aninitializer_value可以是一个表达式,也可以是另一个object_or_collection_initializer。这也意味着,尽管它们可能看起来像这样,object_or_collection_initializer但 ,即类似 的东西{ 12, 3, 4, 5, 6 },并不是一种表达。
另一方面,作业不允许这样做。赋值只允许表达式位于右侧:
assignment
: unary_expression assignment_operator expression
;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |