为什么这个C#赋值会抛出异常?

Otá*_*cio 7 c#

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中正常编译.

Jon*_*Jon 6

这条线

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)


Chr*_*int 4

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 的原因