using System;
using System.Collections.Generic;
using System.Linq;
public class Test
{
public static void Main()
{
var foo = new Foo();
foo.GetFoo1().Add("hello! why can I do this??");
Console.WriteLine(string.Join(", ", foo.GetFoo1()));
foo.GetFoo2().Add("this won't change the field");
Console.WriteLine(string.Join(", ", foo.GetFoo2()));
// Won't compile:
// foo.GetFoo3().Add("??");
((IList<string>) foo.GetFoo3()).Add("This works, but people are unlikely to make this mistake");
Console.WriteLine(string.Join(", ", foo.GetFoo3().ToList()));
}
class Foo
{
private readonly List<string> foo = new List<string>();
public List<string> GetFoo1()
{
return this.foo;
}
public List<string> GetFoo2()
{
return this.foo.ToList();
}
public IEnumerable<string> GetFoo3()
{
return this.foo;
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CgpwdWJsaWMgY2xhc3MgVGVzdAp7CglwdWJsaWMgc3RhdGljIHZvaWQgTWFpbigpCgl7CgkgICAgdmFyIGZvbyA9IG5ldyBGb28oKTsKCSAgICBmb28uR2V0Rm9vMSgpLkFkZCgiaGVsbG8hIHdoeSBjYW4gSSBkbyB0aGlzPz8iKTsKCSAgICBDb25zb2xlLldyaXRlTGluZShzdHJpbmcuSm9pbigiLCAiLCBmb28uR2V0Rm9vMSgpKSk7CgkgICAgCgkgICAgZm9vLkdldEZvbzIoKS5BZGQoInRoaXMgd29uJ3QgY2hhbmdlIHRoZSBmaWVsZCIpOwoJICAgIENvbnNvbGUuV3JpdGVMaW5lKHN0cmluZy5Kb2luKCIsICIsIGZvby5HZXRGb28yKCkpKTsKCSAgICAKCSAgICAvLyBXb24ndCBjb21waWxlOgoJICAgIC8vIGZvby5HZXRGb28zKCkuQWRkKCI/PyIpOwoJICAgIAoJICAgICgoSUxpc3Q8c3RyaW5nPikgZm9vLkdldEZvbzMoKSkuQWRkKCJUaGlzIHdvcmtzLCBidXQgcGVvcGxlIGFyZSB1bmxpa2VseSB0byBtYWtlIHRoaXMgbWlzdGFrZSIpOwoJICAgIENvbnNvbGUuV3JpdGVMaW5lKHN0cmluZy5Kb2luKCIsICIsIGZvby5HZXRGb28zKCkuVG9MaXN0KCkpKTsKCX0KCQoJY2xhc3MgRm9vCgl7CgkgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PHN0cmluZz4gZm9vID0gbmV3IExpc3Q8c3RyaW5nPigpOwoJICAgIAoJICAgIHB1YmxpYyBMaXN0PHN0cmluZz4gR2V0Rm9vMSgpCgkgICAgewoJICAgICAgICByZXR1cm4gdGhpcy5mb287CgkgICAgfQoJICAgIAoJICAgIHB1YmxpYyBMaXN0PHN0cmluZz4gR2V0Rm9vMigpCgkgICAgewoJICAgICAgICByZXR1cm4gdGhpcy5mb28uVG9MaXN0KCk7CgkgICAgfQoJICAgIAoJICAgIHB1YmxpYyBJRW51bWVyYWJsZTxzdHJpbmc+IEdldEZvbzMoKQoJICAgIHsKCSAgICAgICAgcmV0dXJuIHRoaXMuZm9vOwoJICAgIH0KCX0KfQ==