带有ReadOnlyCollection的意外StackOverflow

时间:2017-03-17 09:16:34

标签: c# stack-overflow

代码:

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>();
     }
}

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

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

您正在访问Modules的getter(和setter)。这导致无休止的递归,最终导致StackOverflowException

你想要做的是:

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

这将适用于您现有的构造函数代码。