Search code examples
c#stack-overflow

Unexpected StackOverflow with ReadOnlyCollection


Code:

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

I acquire StackOverflow error in Modules private set; while trying to Modules = new ReadOnlyCollection<IModule>(_modules); and I can't understand the cause of it. I suspect that it's somehow linked with interfaces, but can't figure out how exactly.

I've find a solution that allows me get behavior that I need:

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

Solution

  • You problem is here:

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

    You are accessing the getter (and the setter) of Modules from itself. That leads to an endless recursion and ultimaptely to a StackOverflowException.

    What you want to do is this:

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

    This will work with your existing constructor code.