2017-03-17 56 views
-1

代碼:意外的StackOverflow與ReadOnlyCollection

interface IModule 
{ 
    string Title{get; set;} 
} 

interface IModularizedStructure 
{ 
    ReadOnlyCollection<IModule> Modules {get;} 
} 

class ModularizedStructure: IModularizedStructure 

{ 
    List<IModule> _modules; 
    public ReadOnlyCollection<IModule> Modules 
    { 
     get 
     { 
      return Modules; 
     } 
     private set 
     { 
      Modules = value; 
     } 
    } 
    public ModularizedStructure() 
    { 
     _modules = new List<IModule>(); 
     Modules = new ReadOnlyCollection<IModule>(_modules); 
    } 
} 

我獲得StackOverflow錯誤Modules private set;試圖Modules = new ReadOnlyCollection<IModule>(_modules);,我無法理解它的原因。我懷疑它以某種方式與接口相關聯,但無法弄清楚究竟如何。

我已經找到一個解決方案,讓我得到的行爲,我需要:

interface IModule 
{ 
    string Title{get; set;} 
} 

interface IModularizedStructure 
{ 
    IList<IModule> Modules {get;} 
} 

class ModularizedStructure: IModularizedStructure 
{ 
    List<IModule> _modules; 
    public IList<IModule> Modules 
    { 
     get 
     { 
      return _modules.AsReadOnly(); 
     } 
    } 
    public ModularizedStructure() 
    { 
     _modules = new List<IModule>(); 
    } 
} 
+5

您提供的代碼不能編譯。在執行最小更改以使其編譯後,它不會失敗(我可以創建類的一個實例)。請提供[mcve]。 –

+0

@JonSkeet我正要說...打我吧:D –

回答

1

您的問題就在這裏:

List<IModule> _modules; 
public ReadOnlyCollection<IModule> Modules 
{ 
    get 
    { 
     return Modules; 
    } 
    private set 
    { 
     Modules = value; 
    } 
} 

您正在訪問的Modules吸氣劑(和二傳)從本身。這導致無限遞歸併最終映射到StackOverflowException

你想要做的是這樣的:

List<IModule> _modules; 
public ReadOnlyCollection<IModule> Modules 
{ 
    get; 
    private set; 
} 

這將與您現有的構造函數代碼工作。

+0

謝謝,這是有效的!但是在我改變一些東西之前,這段代碼總是會拋出我「你應該實現這一點,get和set不是抽象的,虛擬的等等......」 – Palov