2016-03-31 245 views
-2
//something is wrong with Parents setter property idk what :C, 
//i'm getting an exception when third ctor executes... 

class Person  { 
     public string Name { get;set; } 
     public DateTime DateOfBirth { get; private set; } 
     public IEnumerable<Person> Parents { get { return (Person[])Parents; } 
private set { Parents = value; } } // I'm getting StackOverFlow here BUT WHY ? 

     public Person(string Name,DateTime DateOfBirth,Person[] parents=null) 
     { 
      this.Name = Name;this.DateOfBirth = DateOfBirth;Parents = parents; 
     } 
    } 
    // Main class 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      //Creating 3 objects and get exception on third 
      Person prs = new Person("Emily", DateTime.Now, null); 
      Person prss = new Person("mark", DateTime.Now); 
      Person psrs = new Person("maras", DateTime.Now, new[] { prs, prss }); 

      if (psrs.Parents != null) 
      { 
       foreach (var parent in psrs.Parents)    
        Console.WriteLine();    
      } 
      else Console.WriteLine("No parents"); 
     } 
    } 

//問題另外:我的類實現是否符合OOP的所有原則? //好吧也許這是因爲在構造函數和屬性我做的事情完全一樣,但如果我會刪除Parent =父母在ctor我怎麼可以通過構造函數初始化我的父母屬性?如果我刪除我的集合propery我不能初始化父母的財產。請幫助 !StackOverFlow異常我不明白爲什麼?

+1

'Parents'是自參照。 – crashmstr

+0

請看[這個問題](http://stackoverflow.com/questions/36344909/stackoverflow-exception-i-dont-get-why) –

+0

帖子不包括[MCVE] - 顯示的代碼不是最小的。 (除了詢問已經問及已經回答了很多時間的問題)。 –

回答

1

您的Parents屬性設置在setter之內。你需要有一個合適的支持領域。

private IEnumerable<Person> _parents 
public IEnumerable<Person> Parents 
{ 
    get { return (Person[])_parents; } 
    private set 
    { 
     _parents = value; 
    } 
} 

編輯: 你也可以使用自動屬性,我沒有看到關於背場的需要。

public IEnumerable<Person> Parents { get; private set; } 
+0

所以我不能解決它使用自動屬性? – waterdev

+0

我會進一步指出,將IEnumerable強制轉換爲數組似乎很奇怪,只能將其作爲IEnumerable返回。 –

+0

沒錯。我更新了答案。他應該只需要一個汽車財產。 –

1

正如@crashmstr說,Parents被引用本身。這裏有點的解釋:

public IEnumerable<Person> Parents 
{ 
    get 
    { 
     return (Person[])Parents; 
    } 
    private set 
    { 
     Parents = value; 
    } 
} 

當使用C#,這樣的性能基本上編譯成下面的代碼:

public IEnumerable<Person> Parents_get() 
{ 
    return (Person[])Parents.get(); 
} 
public void Parents_set(IEnumerable<Person> value) 
{ 
    Parents_set(value); 
} 

這使得它更清晰地表明爲什麼它是自引用的。

您可以簡單地定義你的財產爲:

public IEnumerable<Person> Parents { get; set; }