[英]Why don't I get stackoverflow exception in overriding and calling virtual function?
[英]StackOverFlow Exception I don't get why?
//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 的所有原則? //好吧,也許是因為在構造函數和屬性中我做了完全相同的事情,但是如果我要在 ctor 中刪除 Parent = parents,我如何通過構造函數初始化我的Parents 屬性? 此外,如果我刪除了我的設置屬性,我將無法初始化Parents 屬性。 請幫忙 !
您的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; }
正如@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; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.