簡體   English   中英

C#數組中的System.InvalidCastException錯誤

[英]System.InvalidCastException error in c# array

我試圖運行一個程序,該程序可以讀取數組中的奇數和偶數,但是不斷出現的錯誤是System.InvalidCastException 這是代碼:

ArrayList Num = new ArrayList();

Console.WriteLine("Enter 5 numbers");

for (int i = 0; 5 > i; i++)
{
    Console.Write((i + 1) + ". ");
    Num.Add(Console.ReadLine());
}

Num.Sort();

Console.Write("Sorted numbers: ");
foreach (string value in Num)
{
    Console.Write(value + " ");
}

Console.ReadLine();

ArrayList odd = new ArrayList();
ArrayList even = new ArrayList();

foreach (int value in Num)
{      
    if (value % 2 != 0)
    {
        odd.Add(value);
    }

    else
    {
        even.Add(value);
    }

}

Console.Write("Odd numbers: ");
foreach (string number in odd)
{
    Console.Write(number + " ");
}

Console.Write("Even numbers: ");
foreach (string numbers in even)
{
    Console.Write(numbers + " ");
}

Console.ReadLine();

該錯誤表明我的int value代碼其值無法轉換。 誰能教我解決此錯誤的正確方法?

好吧,讓我們從頭開始。 如果查看Console.ReadLine的返回值,則會看到它返回一個string

返回值
類型:System.String

ArrayList可以包含不同類型的對象。 您的代碼可以很好地編譯,因為Num掩蓋了對象類型之間的差異。

稍后嘗試遍歷ArrayList Num您假定其中的每個元素都是int類型:

foreach (int value in Num)

但事實並非如此 您已經用字符串填充了它。 當編譯器到達此行時,它將隱式嘗試將每個元素轉換為int (因為您已這樣告知),但是簡單的強制轉換為int string會導致您遇到的異常

這里可以采用幾種解決方案。

1)
您可以將循環中的對象視為它們的類型,即object 然后,在每次迭代中,您可以嘗試使用TryParse將它們轉換為int ,如果轉換有效,則可以將它們添加到列表中:

foreach (object value in Num)
{
    int intvalue = 0;

    if (Int32.TryParse(value.ToString(), out intvalue)
    {
        if (intvalue % 2 != 0)
        {
            odd.Add(intvalue);
        }
        else
        {
            even.Add(intvalue);
        }
    }
}

2)
另一種可能性是當您從控制台讀取數字時立即轉換數字,並選擇一個適合所討論類型的集合,即int 例如通用列表

List<int> Num_Int_List = new List<int>();

for (int i = 0; 5 > i; i++)
{
    Console.Write((i + 1) + ". ");
    if (int.TryParse(Console.ReadLine(), out enteredNumber)
    {
        Num_Int_List.Add(enteredNumber);
    }
    else
    {
        Console.WriteLine("Sorry that was not an integer, try again please");
        i-- // here set the counter to the last step to allow the user to repeat the step
    }
}

使用相同的集合List<int>表示oddeven ,您可以按原樣使用foreach循環:

List<int> odd = new List<int>();
List<int> even = new List<int>();

選擇一個像List<int>這樣的類型安全的集合將幫助您在編譯時而不是像您的情況下那樣在運行時解決與類型不兼容的問題

我建議您這樣做,在閱讀時解析數字,並利用C#是一種類型化語言這一事實​​。 我也考慮使用Generic集合,List等:

List<int> Num = new List<int>();

Console.WriteLine("Enter 5 numbers");

while (Num.Count < 5)
{
    Console.Write((Num.Count + 1) + ". ");

    int result = 0;
    if (int.TryParse(Console.ReadLine(), out result))
    {
        Num.Add(result);
    }
    else
    {
        Console.WriteLine("Please enter a number!!");
    }
}

Num.Sort();

Console.Write("Sorted numbers: ");
foreach (int value in Num)
{
    Console.Write(value + " ");
}

Console.ReadLine();

List<int> odd = new List<int>();
List<int> even = new List<int>();


foreach (int value in Num)
{

    if (value % 2 != 0)
    {
        odd.Add(value);
    }

    else
    {
        even.Add(value);
    }

}

Console.Write("Odd numbers: ");
foreach (int number in odd)
{
    Console.Write(number + " ");
}

Console.Write("Even numbers: ");
foreach (int numbers in even)
{
    Console.Write(numbers + " ");
}


Console.ReadLine();

正如有人在評論部分中寫的那樣,我將ArrayList替換為List,然后可以將字符串解析為int。

這是我的代碼,希望對您有所幫助。

{

        List<string> Num = new List<string>();


        Console.WriteLine("Enter 5 numbers");

        for (int i = 0; 5 > i; i++)
        {
            Console.Write((i + 1) + ". ");
            Num.Add(Console.ReadLine());
        }

        Num.Sort();

        Console.Write("Sorted numbers: ");
        foreach (string value in Num)
        {
            Console.Write(value + " ");
        }

        Console.ReadLine();

        List<string> odd = new List<string>();
        List<string> even = new List<string>();


        foreach (var value in Num)
        {

            if (Int32.Parse(value) % 2 != 0)
            {
                odd.Add(value);
            }

            else
            {
                even.Add(value);
            }

        }

        Console.Write("Odd numbers: ");
        foreach (string number in odd)
        {
            Console.Write(number + " ");
        }

        Console.Write("Even numbers: ");
        foreach (string numbers in even)
        {
            Console.Write(numbers + " ");
        }


        Console.ReadLine();
    }

問題在於以下代碼:

foreach (int value in Num)
{
    if (value % 2 != 0)
    {
        odd.Add(value);
    }
    else
    {
        even.Add(value);
    }    
}

您正在嘗試將string直接轉換為int ,這是不可能的。 我在下面提到了一種解決方案,其中有很多可能的解決方案,其中我使用Convert.ToInt32字符串value

foreach (var value in Num)
{
    if (Convert.ToInt32(value) % 2 != 0)
    {
        odd.Add(value);
    }
    else
    {
        even.Add(value);
    }
}
ArrayList Num = new ArrayList();

Console.WriteLine("Enter 5 numbers");

for (int i = 0; 5 > i; i++)
{
    Console.Write((i + 1) + ". ");
    Num.Add(Console.ReadLine());
}

Num.Sort();

Console.Write("Sorted numbers: ");
foreach (string value in Num)
{
    Console.Write(value + " ");
}

Console.ReadLine();

ArrayList odd = new ArrayList();
ArrayList even = new ArrayList();
int V;
foreach (string value in Num)
{
    V = int.Parse(value);
    if (V % 2 != 0)
    {
        odd.Add(value);
    }
    else
    {
        even.Add(value);
    }
}

Console.Write("Odd numbers: ");
foreach (string number in odd)
{
    Console.Write(number + " ");
}

Console.Write("Even numbers: ");
foreach (string numbers in even)
{
    Console.Write(numbers + " ");
}

Console.ReadLine();

拜托了

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM