C#对象初始化只读集合属性

对于我的生活,我无法弄清楚下面的C#代码示例中发生了什么。 testing类的集合(List)属性被设置为只读,但我似乎可以在对象初始值设定项中赋值给它。

**编辑:修正了列表“getter”的问题

using System; using System.Collections.Generic; using NUnit.Framework; namespace WF4.UnitTest { public class MyClass { private List<string> _strCol = new List<string> {"test1"}; public List<string> StringCollection { get { return _strCol; } } } [TestFixture] public class UnitTests { [Test] public void MyTest() { MyClass c = new MyClass { // huh? this property is read only! StringCollection = { "test2", "test3" } }; // none of these things compile (as I wouldn't expect them to) //c.StringCollection = { "test1", "test2" }; //c.StringCollection = new Collection<string>(); // 'test1', 'test2', 'test3' is output foreach (string s in c.StringCollection) Console.WriteLine(s); } } } 

这个:

 MyClass c = new MyClass { StringCollection = { "test2", "test3" } }; 

被翻译成这样:

 MyClass tmp = new MyClass(); tmp.StringCollection.Add("test2"); tmp.StringCollection.Add("test3"); MyClass c = tmp; 

它从来没有试图调用setter – 只是调用Add来调用getter的结果。 请注意,它也不清除原始集合。

这在C#4规范的第7.6.10.3节中有更详细的描述。

编辑:就像一个兴趣点,我有点惊讶,它调用了两次的getter。 我期望它调用一次getter,然后调用Add两次…规范包括一个例子,certificate这一点。

你不是在给二传手打电话。 你实际上每次调用c.StringCollection.Add(...) (对于“test2”和“test3”) – 它是一个集合初始值设定项 。 因为这是财产分配,这将是:

 // this WON'T work, as we can't assign to the property (no setter) MyClass c = new MyClass { StringCollection = new StringCollection { "test2", "test3" } }; 

我认为,只读,你不能这样做

 c.StringCollection = new List<string>(); 

但你可以分配项目列表…
我错了吗?

StringCollection属性没有setter,所以除非你添加一个你不能修改它的值。