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;
}