我有一个名为Foo的类,它有一个内部类Inner.Inner类引用了外部类的字段.
public class Foo
{
int foo = 2;
public class Inner
{
Foo f;
public Inner(Foo f)
{
f=f;
}
public override String ToString()
{
return "Inner[foo="+f.foo+"]" ;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的计划.
public class Program
{
public static void Main(string[] args)
{
Foo foo=new Foo();
Foo.Inner inner=new Foo.Inner(foo);
Console.WriteLine(inner.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
编译它没有问题,但是当我运行它时失败了.它给了我一个例外
未处理的异常:System.NullReferenceException:未将对象引用设置为对象的实例.在Foo.Inner.ToString()
这里发生了什么?
问题:
你的问题在于做f = f.它没有做任何富有成效的事情.此行不更新Inner字段f,它仍然未分配或null.所以,当你这样做时Console.WriteLine(inner.ToString());,它会抛出错误"Inner[foo=" + f.foo + "]"
VS也显示警告

解决方案:
1.将构造函数变量更改为其他变量.像这样
Foo f;
public Inner(Foo f1)
{
f = f1;
}
Run Code Online (Sandbox Code Playgroud)
或
2.添加this以区分变量.
Foo f;
public Inner(Foo f)
{
this.f = f;
}
Run Code Online (Sandbox Code Playgroud)