![](/img/trans.png)
[英]Exception of type 'System.StackOverflowException' was thrown
[英]Exception of type 'System.StackOverflowException' was thrown.'
為什么這個? 這是我的代碼。 這是我的“ Kwadrat”課
public class Kwadrat : FormView
{
public int X {get;set;}
public int Y {get;set;}
public Kwadrat Parent { get; set; }
public void pozycja()
{
X = Parent.X;
Y = Parent.Y;
}
}
在這一行中,Visual Studio向我顯示一個錯誤
Kwadrat k1 = new Kwadrat();
這是FormView.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
namespace ObjectMoving
{
public partial class FormView : Form
{
enum Position
{
Left, Right, Up, Down
};
private int NUMBER_OF_SQUARES=20;
private int SQUARE_SIZE=15;
Point _start = new Point(30,30);
private Position _objPosition;
Kwadrat k1 = new Kwadrat();
Kwadrat k2 = new Kwadrat();
private Kwadrat k3 = new Kwadrat();
List<Rectangle> Snake = new List<Rectangle>();
Losowanie l1=new Losowanie();
public FormView()
{
InitializeComponent();
_objPosition = Position.Down;
k1.X = 30;
k1.Y = 60;
k2.Parent = k1;
k2.X = 30;
k2.Y = 45;
k3.Parent = k2;
k3.X = 30;
k3.Y = 30;
l1.losowa();
}
private void FormView_Paint(object sender, PaintEventArgs e)
{
for (int i = 0; i <= NUMBER_OF_SQUARES; i++)
{
//rysowanie lini horyzontalnych
e.Graphics.DrawLine(new Pen(Brushes.Red),
_start.X,
_start.Y + SQUARE_SIZE * i,
_start.X + SQUARE_SIZE * NUMBER_OF_SQUARES,
_start.Y + SQUARE_SIZE * i);
//Rysowanie lini wertykalnych
e.Graphics.DrawLine(new Pen(Brushes.Brown),
_start.X + SQUARE_SIZE * i,
_start.Y,
_start.X + SQUARE_SIZE * i,
_start.Y + SQUARE_SIZE * NUMBER_OF_SQUARES);
}
e.Graphics.FillRectangle((Brushes.Aqua), k1.X, k1.Y, SQUARE_SIZE, SQUARE_SIZE);
e.Graphics.FillRectangle((Brushes.Aqua), k2.X, k2.Y, SQUARE_SIZE, SQUARE_SIZE);
e.Graphics.FillRectangle((Brushes.Aqua), k3.X, k3.Y, SQUARE_SIZE, SQUARE_SIZE);
e.Graphics.FillRectangle((Brushes.Red),l1.RandomNumber, l1.RandomNumber2, SQUARE_SIZE, SQUARE_SIZE);
//foreach (Rectangle Object in Snake)
//{
// e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), k3.X, k3.Y, SQUARE_SIZE, SQUARE_SIZE);
//}
}
//odswiezanie
public void tmrMoving_Tick(object sender, EventArgs e)
{
//kolizja();
k3.pozycja();
k2.pozycja();
if (_objPosition == Position.Right)
{
k1.X += 15;
}
else if (_objPosition == Position.Left)
{
k1.X -= 15;
}
else if (_objPosition == Position.Up)
{
k1.Y -= 15;
}
else if (_objPosition == Position.Down)
{
k1.Y += 15;
}
if (k1.X < 29)
{
tmrMoving.Enabled = false;
tmrMoving.Stop();
MessageBox.Show("Wyjechales poza plansze");
Application.Exit();
}
else if (k1.X > 315)
{
tmrMoving.Enabled = false;
tmrMoving.Stop();
MessageBox.Show("Wyjechales poza plansze");
Application.Exit();
}
else if(k1.Y<29)
{
tmrMoving.Enabled = false;
tmrMoving.Stop();
MessageBox.Show("Wyjechales poza plansze");
Application.Exit();
}
else if (k1.Y > 315)
{
tmrMoving.Enabled = false;
tmrMoving.Stop();
MessageBox.Show("Wyjechales poza plansze");
Application.Exit();
}
Invalidate();
}
//ruch strzalkami
private void FormView_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Left)
{
// s1.Sprawdzenie();
_objPosition = Position.Left;
}
else if (e.KeyCode == Keys.Right)
{
_objPosition = Position.Right;
}
else if (e.KeyCode == Keys.Up)
{
_objPosition = Position.Up;
}
else if (e.KeyCode == Keys.Down)
{
_objPosition = Position.Down;
}
}
//public void kolizja()
//{
// if (k1.X == l1.RandomNumber && k1.Y == l1.RandomNumber2)
// {
// l1.losowa();
// Snake.Add(new Rectangle(k3.X, k3.Y, 15, 15));
// }
//}
}
}
您這里遇到的問題是“圓形參考”的味道。
您的Kwadrat
類基於FormView
,這意味着每當您創建一個新的Kwadrat
實例時,例如,您已經在構造k1
的行上進行了Kwadrat
,這意味着將發生以下情況:
Kwadrat
的新實例,因此讓我們調用其構造函數 FormView
,因此讓我們調用其構造函數並設置其成員變量等。 FormView
,它需要一個名為K1的Kwadrat
實例,讓我們創建它 現在,我們循環回到“ 1”,然后永遠重復一次,這就是為什么您收到自己的StackOverflowException
原因。 在這種情況下,我們正在查看的類包含一個名為Parent
的屬性,該屬性的類型本身就是一個“紅色鯡魚”,因為這不是錯誤的原因,即使您最終遇到的是Kwadrat
實例如果將Parent
設置為self(例如instance.Parent = instance;
),則嘗試遍歷該實例的父級層次結構時,可能會看到相同的錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.