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