抽象List <T>。添加不适用于基本构造函数

时间:2019-06-06 16:49:08

标签: c#

我有一个简单的类,它用预定义的值覆盖列表获取方法,但是,在基本构造函数上调用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方法仍适用于这种情况。

2 个答案:

答案 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;