Recently, I came across some code that looked like this:
public class Test
{
public ICollection<string> Things { get; set; }
public Test()
{
Things = new List<string> { "First" };
}
public static Test Factory()
{
return new Test
{
Things = { "Second" }
};
}
}
Calling Test.Factory()
results in a Test
object with a Things
collection containing both "First"
and "Second"
.
It looks like the line Things = { "Second" }
calls the Add
method of Things
. If the ICollection
is changed to an IEnumerable
, there is a syntax error stating "IEnumerable<string> does not contain a definition for 'Add'
".
It is also apparent that you can only use this kind of syntax in an object initialiser. Code such as this is invalid:
var test = new Test();
test.Things = { "Test" };
What is the name of this feature? In which version of C# was it introduced? Why is it only available in object initialisers?