System.ArgumentOutOfRangeException 在 Console.CursorLeft = X
System.ArgumentOutOfRangeException on Console.CursorLeft = X
我得到了这个Exception
,但我真的不明白为什么。
我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SomeColors
{
class Program
{
public static int currentCursorX = Console.CursorLeft;
public static int currentCursorY = Console.CursorTop;
public static Color color = new Color();
public static void SetCursorXPosition(int xPosition)
{
currentCursorX = xPosition;
Console.CursorLeft = currentCursorX; // System.ArgumentOutOfRangeException
}
public static void DrawRightHalfCircle(int height,int width,char printedCharacter)
{
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
SetCursorXPosition(currentCursorX - 1);
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
}
static void Main(string[] args)
{
const char PRINTED_CHARACTER = '*';
const ConsoleColor WHITE = ConsoleColor.White;
color.SetColor(WHITE);
DrawRightHalfCircle(4, 4, PRINTED_CHARACTER);
Console.ReadLine();
}
我在 Console.CursorLeft = currentCursorX;
行的最后一次循环迭代中得到 Exception
。
有什么建议吗?
有一个额外的 SetCursorXPosition(currentCursorX - 1)
使 currentCursorX
在第二个循环的最后一次迭代中为负数。删除它减一循环 cycle :
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
// SetCursorXPosition(currentCursorX - 1); // <-- Remove this
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
或者最终:
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
SetCursorXPosition(currentCursorX - 1);
for (int i = 0;i < (height / 2) - 1;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
您收到错误是因为在循环的最后一次迭代中,变量 currentCursorX
设置为 0
。
最后一次迭代运行时调用此代码:
SetCursorXPosition(currentCursorX - 1);
我们现在学到的是一样的:
SetCursorXPosition(0 - 1);
所以当我们到达这里时:
Console.CursorLeft = currentCursorX;
我们正在尝试将值设置为 -1
,这超出了允许值的范围。
尝试将行更改为:
Console.CursorLeft = currentCursorX >= 0 ? currentCursorX : 0;
基本上说:
if (currentCursorX >= 0)
{
Console.CursorLeft = currentCursorX;
}
else
{
Console.CursorLeft = 0;
}
我得到了这个Exception
,但我真的不明白为什么。
我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SomeColors
{
class Program
{
public static int currentCursorX = Console.CursorLeft;
public static int currentCursorY = Console.CursorTop;
public static Color color = new Color();
public static void SetCursorXPosition(int xPosition)
{
currentCursorX = xPosition;
Console.CursorLeft = currentCursorX; // System.ArgumentOutOfRangeException
}
public static void DrawRightHalfCircle(int height,int width,char printedCharacter)
{
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
SetCursorXPosition(currentCursorX - 1);
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
}
static void Main(string[] args)
{
const char PRINTED_CHARACTER = '*';
const ConsoleColor WHITE = ConsoleColor.White;
color.SetColor(WHITE);
DrawRightHalfCircle(4, 4, PRINTED_CHARACTER);
Console.ReadLine();
}
我在 Console.CursorLeft = currentCursorX;
行的最后一次循环迭代中得到 Exception
。
有什么建议吗?
有一个额外的 SetCursorXPosition(currentCursorX - 1)
使 currentCursorX
在第二个循环的最后一次迭代中为负数。删除它减一循环 cycle :
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
// SetCursorXPosition(currentCursorX - 1); // <-- Remove this
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
或者最终:
for (int i = 0;i < height / 2;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX + 1);
}
SetCursorXPosition(currentCursorX - 1);
for (int i = 0;i < (height / 2) - 1;i++)
{
Console.WriteLine(printedCharacter);
SetCursorXPosition(currentCursorX - 1);
}
您收到错误是因为在循环的最后一次迭代中,变量 currentCursorX
设置为 0
。
最后一次迭代运行时调用此代码:
SetCursorXPosition(currentCursorX - 1);
我们现在学到的是一样的:
SetCursorXPosition(0 - 1);
所以当我们到达这里时:
Console.CursorLeft = currentCursorX;
我们正在尝试将值设置为 -1
,这超出了允许值的范围。
尝试将行更改为:
Console.CursorLeft = currentCursorX >= 0 ? currentCursorX : 0;
基本上说:
if (currentCursorX >= 0)
{
Console.CursorLeft = currentCursorX;
}
else
{
Console.CursorLeft = 0;
}