0

インデックスの get/set 部分を使用すると、スタック オーバーフローが発生します。get set の代わりにリストに値を入れようとしましたが、結果は良くありませんでした。

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]whereを使用しようとすると、予想どおりi <= 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"));
    }
}

リストにまだ存在しないインデックスにアクセスすることはできません。

そこから特定の要素を取得するためにOKを追加した後:

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

list.Addインデクサー セッターでは使用しないでください。これは最小驚きの原則に違反しています。

それ以外の唯一の可能性は、コンストラクターで定義済みの数の null 要素を持つリストを作成することです。しかし、これはお勧めしません。

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

アプローチ全体の正しい方法は使用してList<Tracks>おり、これで完了です。

于 2014-04-17T12:37:59.140 に答える