【问题标题】:List<element> initialization fires "Process is terminated due to StackOverflowException"List<element> 初始化触发“由于 StackOverflowException 而终止进程”
【发布时间】:2010-03-24 20:43:06
【问题描述】:

我有如下结构,当我进行初始化时:

ArrayList nodesMatrix = null;
List<vertex> vertexMatrix = null;
List<bool> odwiedzone = null;
List<element> priorityQueue = null;

vertexMatrix = new List<vertex>(nodesNr + 1);
nodesMatrix = new ArrayList(nodesNr + 1);
odwiedzone = new List<bool>(nodesNr + 1);
priorityQueue = new List<element>();

arr.NodesMatrix = nodesMatrix;
arr.VertexMatrix = vertexMatrix;
arr.Odwiedzone = odwiedzone;
arr.PriorityQueue = priorityQueue; //only here i have exception

调试器触发 由于 StackOverflowException 而终止进程 :/ 知道为什么这个集合会触发这个异常吗?

private struct arrays
    {
        ArrayList nodesMatrix;

        public ArrayList NodesMatrix
        {
            get { return nodesMatrix; }
            set { nodesMatrix = value; }
        }
        List<vertex> vertexMatrix;

        public List<vertex> VertexMatrix
        {
            get { return vertexMatrix; }
            set { vertexMatrix = value; }
        }
        List<bool> odwiedzone;

        public List<bool> Odwiedzone
        {
            get { return odwiedzone; }
            set { odwiedzone = value; }
        }
        public List<element> PriorityQueue
        {
            get { return PriorityQueue; }
            set { PriorityQueue = value; }
        }


    }
    public struct element : IComparable
    {
        public double priority
        {
            get { return priority; }
            set { priority = value; }
        }
        public int node
        {
            get { return node; }
            set { node = value; }
        }
        public element(double _prio, int _node)
        {
            priority = _prio;
            node = _node;
        }

        #region IComparable Members

        public int CompareTo(object obj)
        {
            element elem = (element)obj;
            return priority.CompareTo(elem.priority);
        }

        #endregion

【问题讨论】:

  • 如果我每次看到这个问题都能得到一块钱,我会成为一个有钱人......!

标签: c# list stack-overflow


【解决方案1】:

您的 PriorityQueue 属性正在引用自身。
您需要更改访问器以使用字段。

List<element> priorityQueue;
public List<element> PriorityQueue
{
    get { return priorityQueue; }
    set { priorityQueue = value; }
}

但是,您应该改用自动实现的属性:

public List<element> PriorityQueue { get; set; }

【讨论】:

  • 类字段名称以下划线开头的一个很好的理由。
  • notepriority 结构的 element 属性也是如此。
  • Fredrik 你说得对,我也有这个错误注意和优先级:/所有这些都是因为我不使用 VS 自动实现属性,但尝试自己写!但现在我一定会记住这一点!!谢谢!
【解决方案2】:

您的属性设置器是递归的。

    public List<element> PriorityQueue
    {
        get { return PriorityQueue; }
        set { PriorityQueue = value; }
    }

将其更改为:

    public List<element> PriorityQueue
    {
        get { return priorityQueue; }
        set { priorityQueue = value; }
    }

【讨论】:

  • 他也没有字段。
  • 我注意到了,我想一旦编译失败他会注意到的。
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 2019-01-04
  • 1970-01-01
  • 2020-11-02
  • 2021-10-11
相关资源
最近更新 更多