C#匿名对象的对象初始化,编译器的奇怪行为

C#匿名对象的对象初始化,编译器的奇怪行为,c#,.net,C#,.net,我注意到C#编译器有一种奇怪的行为,我无法解释 假设您希望以以下方式初始化新对象: Type1 testObj = new Type1 { Prop1 = "TEST", Prop2 = new Type2 { Prop = "TEST2" } }; 一切顺利。编译器不会抱怨,也不会引发运行时异常 我试图以类似的方式进行本地化,从代码中删除显式的newtype2,如下所示: Type1 testObj = new Type1 {

我注意到C#编译器有一种奇怪的行为,我无法解释

假设您希望以以下方式初始化新对象:

    Type1 testObj = new Type1 { 
        Prop1 = "TEST",
        Prop2 = new Type2 { Prop = "TEST2" }

    };
一切顺利。编译器不会抱怨,也不会引发运行时异常

我试图以类似的方式进行本地化,从代码中删除显式的
newtype2
,如下所示:

    Type1 testObj = new Type1 { 
        Prop1 = "TEST",
        Prop2 = { Prop = "TEST2" }

    };
编译器不会抱怨,但在运行时会抛出错误:

System.NullReferenceException:对象引用未设置为实例 指一个物体

我注意到我不能删除
newtype1
,因为在这种情况下编译器会抱怨。仅当我在属性初始化中而不是在主对象中删除“new”关键字时,编译才会成功

Visual Studio没有向我显示任何键入错误,并建议我正确使用对象属性(.NET Fiddle),因为类型似乎是推断出来的(并且工具提示提供了有关这方面的正确信息)

下面是一个工作演示:

下面是一个不起作用的演示:

有人能解释一下这种行为吗?
是否有任何情况下可以避免使用new关键字,而不会出现任何编译器或运行时错误?(那太酷了!:)

这是因为您没有创建新的
Prop2
。相反,您将为
Prop2.Prop
分配一个新值,该值将失败,因为
Prop2
为空

Prop2 = { Prop = "TEST2" }
类似于:

testObj.Prop2.Prop = "TEST2";
由于上述原因,它失败了

新的…
变体实际上是:

Type1 testObj = new Type1();
testObj.Prop1 = "TEST",
var x = new Type2();
x.Prop = "TEST2";
testObj.Prop2 = x;