Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
新的C#6对象初始值设定项语法?_C#_Roslyn_C# 6.0 - Fatal编程技术网

新的C#6对象初始值设定项语法?

新的C#6对象初始值设定项语法?,c#,roslyn,c#-6.0,C#,Roslyn,C# 6.0,我刚刚注意到,在Visual Studio 2015中编写的C#中,以下内容是可能的,但我以前从未见过: 公共类X { 公共int A{get;set;} 公共Y B{get;set;} } 公共Y类 { 公共int C{get;set;} } 公共图书馆 { VARx=newx{A=1,B={C=3}; } 我的期望是Foo必须像这样实施: public void Foo() { var x=新x{A=1,B=新Y{C=3}; } 请注意,无需调用新Y 这在C#6中是新的吗?我在中没有看到

我刚刚注意到,在Visual Studio 2015中编写的C#中,以下内容是可能的,但我以前从未见过:

公共类X
{
公共int A{get;set;}
公共Y B{get;set;}
}
公共Y类
{
公共int C{get;set;}
}
公共图书馆
{
VARx=newx{A=1,B={C=3};
}
我的期望是Foo必须像这样实施:

public void Foo()
{
var x=新x{A=1,B=新Y{C=3};
}
请注意,无需调用
新Y


这在C#6中是新的吗?我在中没有看到任何提到这一点,所以可能它一直都在那里?

如果运行此代码,您将得到一个NullReferenceException

它不会创建
Y
的实例,它将调用
X.B
属性的getter并尝试为属性C赋值

一直都是这样。根据C#5.0语言规范:

在等号后指定对象初始值设定项的成员初始值设定项是嵌套对象初始值设定项,即嵌入式对象的初始化。嵌套对象初始值设定项中的指定将被视为对字段或属性成员的指定,而不是为字段或属性指定新值


此功能在C#3.0中作为对象初始值设定项引入

参见第页的示例。其中169项:

这和

Rectangle __r = new Rectangle();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
Rectangle r = __r;

你说得对,谢谢。因此,我们可以将
X.B
的声明更改为
publicyb{get;}=newy()此代码将按预期工作。奇怪的是,我以前从未注意到这种语法!此功能是在C#3.0中引入的,可能与
Rectangle __r = new Rectangle();
__r.P1.X = 0;
__r.P1.Y = 1;
__r.P2.X = 2;
__r.P2.Y = 3;
Rectangle r = __r;