2014-07-08 106 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; 
     }