2014-07-08 108 views
0

我有一个名为Foo的类,它有一个内部类Inner。 Inner类引用外部类的字段。C#调用内部类的方法引用外部类

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+"]" ; 
     } 
    } 
} 

这是我的程序。

public class Program 
{ 
    public static void Main(string[] args) 
    {  
     Foo foo=new Foo(); 
     Foo.Inner inner=new Foo.Inner(foo); 
     Console.WriteLine(inner.ToString()); 
    } 
} 

编译它没有问题,但是当我运行它时会失败。 它给了我一个异常

未处理的异常:System.NullReferenceException:对象 不设置到对象的实例。在Foo.Inner.ToString()

这是怎么回事?

+0

为什么你想创建一个嵌套类?为什么它不能是两个独立的类,它们在'Foo'中具有'Inner'类的只读属性? –

+0

http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it –

回答

6

问题:
您的问题是在做f = f。它没有做任何生产性的事情。此行不会更新Inner字段f并且它仍未分配或null。所以,当你做Console.WriteLine(inner.ToString());,它抛出在"Inner[foo=" + f.foo + "]"

错误另VS显示一个警告

enter image description here

解决方案:
1.更改构造函数变量别的东西。像这样

Foo f; 
public Inner(Foo f1) 
{ 
    f = f1; 
} 


OR
2.添加this变量之间的区别。

Foo f; 
public Inner(Foo f) 
{ 
    this.f = f; 
} 
+0

我不知道是否“释放”编译会切断整个操作,避免异常...一个很好的测试! –

+0

@MarioVernari没有它不会,如果它切了,那么代码将无法工作! – lahsrah

+1

@MarioVernari:即使忽略警告,它仍然会在释放模式下抛出异常,但是这行仍然是'return'Inner [foo =“+ f.foo +”]“;'。 –

3

要解决该问题,您可以chnage以下

f=f;

this.f = f;

0

你必须assgined一个Foo obejct像

 Foo f; 
     public Inner(Foo _f) 
     { 
      f = _f; 
     }