0

我因使用索引的 get/set 部分而导致堆栈溢出。我尝试将值放入列表而不是 get 集中,但结果不佳。

class TrackList : CollectionBase
{
    public Tracks this[int i]
    {
        get
        {
            return this[i];
        }
        set
        {
            this[i] = value;
        }
    }
}

主要的:

class Program
{
    public static void Main(string[] args)
    {
        TrackList l1 = new TrackList();
        l1[0] = new Tracks(1, "Random");
        l1[1] = new Tracks(2, "Random");
        l1[2] = new Tracks(3, "Random");
    }
}

答: 我在我的 get/set 中循环。这是工作代码:

class TrackList : CollectionBase
{
    public Tracks this[int i]
    {
        get
        {
            return (Tracks) List[i];
        }
        set
        {
            List[i] = value;
        }
    }
}

主要的:

class Program
{
    public static void Main(string[] args)
    {
        TrackList l1 = new TrackList();
        l1.Add(new Tracks(1, "random"));
        l1.Add(new Tracks(2, "random"));
        l1.Add(new Tracks(3, "random"));
    }
}
4

2 回答 2

3

您无限次地递归调用属性索引器。我想你想要这个:

public Tracks this[int i]
{
    get
    {
        return (Tracks) List[i];
    }
    set
    {
        List[i] = value;
    }
}

然后,添加您的项目:

TrackList l1 = new TrackList();
l1.List.Add(new Tracks(1, "Random"));
l1.List.Add(new Tracks(2, "Random"));
l1.List.Add(new Tracks(3, "Random"));

然后使用索引器替换一个项目:

l1[1] = new Tracks(2, "Replacement");

或使用索引器检索项目:

var firstItem = l1[0];

正如您所期望的那样,尝试使用l1[i]wherei <= l1.Count将产生一个。ArgumentOutOfRangeException

于 2014-04-17T12:01:34.183 回答
0

首先,您的 stackoverflow 异常是由自己调用索引器引起的:

    return this[i];

你调用你的索引器,它调用你的索引器,然后调用你的索引器等等。

您的主程序应如下所示:

class Program
{
    public static void Main(string[] args)
    {
        TrackList l1 = new TrackList();
        l1.Add(new Tracks(1, "Random"));
        l1.Add(new Tracks(2, "Random"));
        l1.Add(new Tracks(3, "Random"));
    }
}

您不能只访问列表中尚不存在的索引。

在您添加它可以从中获取某个元素之后:

Tracks t = l1[2]; // to get the third element in your list

不要list.Add在索引器设置器中使用。这违反了最小惊讶原则

否则,唯一的可能性是在构造函数中创建一个包含预定义数量的空元素的列表。但我不推荐这个。

TrackList l1 = new TrackList(3); // in constructor create a list of 3 null elements

整个方法的正确方法是使用List<Tracks>,你就完成了。

于 2014-04-17T12:37:59.140 回答