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