public class A
{
private string _a_string;
public string AString
{
get { return _a_string; }
set { _a_string = value; }
}
}
public class B
{
private string _b_string;
private A _a;
public A A
{
get { return _a; }
set { _a = value; }
}
public string BString
{
get { return _b_string; }
set { _b_string = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
B _b = new B { A = { AString = "aString" }, BString = "bString" };
Run Code Online (Sandbox Code Playgroud)
System.NullReferenceException:未将对象引用设置为对象的实例.
这有效:
B _b = new B { A = new A { AString = "aString" }, BString = "bString" };
Run Code Online (Sandbox Code Playgroud)
两者都在VS2010中正常编译.
这条线
B _b = new B { A = { AString = "aString" }, BString = "bString" };
Run Code Online (Sandbox Code Playgroud)
相当于
B _b = new B();
_b.A.AString = "aString"; // null reference here: _b.A == null
_b.BString = "bString";
Run Code Online (Sandbox Code Playgroud)
我认为在这种形式中,很明显发生了什么.
将其与有效表达式的等效形式进行比较:
B _b = new B();
_b.A = new A();
_b.A.AString = "aString"; // just fine now
_b.BString = "bString";
Run Code Online (Sandbox Code Playgroud)
B 中没有 A 的实例化,除非您像第二个示例中那样显式实例化它。
改成;
public class B
{
private string _b_string;
private A _a = new A();
public A A
{
get { return _a; }
set { _a = value; }
}
public string BString
{
get { return _b_string; }
set { _b_string = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
使用第一个例子。
简而言之,如果没有new A(),就没有A,这就是 NullReferenceException 的原因