我有一个简单的类,它用预定义的值覆盖列表获取方法,但是,在基本构造函数上调用add方法时,它不会添加新值。
这是我的代码,显示错误:
using System.Collections.Generic;
using NUnit.Framework;
public class SimpleTest
{
[Test]
public void Test()
{
var child = new ChildClass();
Assert.AreEqual(4, child.myList.Count);
}
private abstract class MyBaseClass
{
public abstract List<string> myList { get; }
public MyBaseClass(string addThis)
{
myList.Add(addThis);
}
}
private class ChildClass : MyBaseClass
{
public override List<string> myList => new List<string> { "one", "two", "three" };
public ChildClass() : base("four")
{
myList.Add("dsada");
}
}
}
这是为什么引起的?由于没有设置器,因此无法用其他列表代替该列表,但是Add方法仍适用于这种情况。
答案 0 :(得分:7)
public override List<string> myList => new List<string> { "one", "two", "three" };
调用getter时,您总是返回一个新列表。创建一个存储列表并返回该列表的字段,或者使用自动实现的属性(您将其填充到构造函数中)。
答案 1 :(得分:3)
当您写public override List<string> myList => new List<string> { "one", "two", "three" };
时,这只是以下内容的捷径:
public override List<string> myList { get { return new List<string> { "one", "two", "three" }; }
因此,您总是返回一个全新的列表。
改为使用此:
public override List<string> myList { get; } = new List<string> { "one", "two", "three" };
这只会为您的媒体资源设置一次初始值。
或者使用背景字段:
private readonly List<string> _myList = new List<string> { "one", "two", "three" };
public override List<string> myList => _myList;