【问题标题】:System.InvalidCastException error in c# arrayc# 数组中的 System.InvalidCastException 错误
【发布时间】:2018-02-14 07:38:30
【问题描述】:

我尝试运行一个可以读取数组中奇数和偶数的程序,但一直出现的错误是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 代码无法转换它的值。谁能教我解决这个错误的正确方法?

【问题讨论】:

标签: c# arrays sorting


【解决方案1】:

好的,让我们从头开始。如果您查看Console.ReadLine 的返回值,您会看到它返回了string

返回值
类型:System.String

ArrayList 可以包含不同类型的对象。您的代码编译得很好,因为 Num 掩盖了对象类型之间的差异。

当您稍后尝试循环遍历您的 ArrayList Num 时,您假设其中的每个元素都是 int 类型:

foreach (int value in Num)

但它不是!你已经用字符串填充了它。当编译器到达这一行时,它会尝试将每个元素隐式转换为 int(因为您已经告诉过它了),但是一个简单的转换形式 stringint 会导致您遇到的那个异常

这里有几种解决方案....

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)
另一种可能性是在您从控制台读取数字时立即转换数字并选择适合相关类型的集合,即@987654336 @。例如一个通用的List

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

oddeven 使用相同的集合List&lt;int&gt;,您可以按原样使用foreach 循环:

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

选择像 List&lt;int&gt; 这样的类型安全集合将帮助您解决与在编译时而不是在运行时的类型不兼容的问题

【讨论】:

    【解决方案2】:

    我建议你这样做,在读入数字时解析数字,利用 C# 是一种类型化语言这一事实​​。另外我会考虑使用通用集合、列表等:

    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();
    

    【讨论】:

      【解决方案3】:

      正如有人在评论部分写的那样,我将 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();
          }
      

      【讨论】:

        【解决方案4】:

        问题在于以下代码:

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

        【讨论】:

        • @KamranShahid 看看edit history 可能有人不喜欢它的第一个版本。你为什么不简单地改变它?
        • @MongZhu 即使是第一个版本,我的回答也是正确的,不值得一票。否决票是针对错误答案的。
        • 我只是对反对票感到好奇。在历史上它没有列出谁以及为什么投反对票
        • @KamranShahid 我也一直很好奇,“在历史上没有列出谁和为什么”不,不是,你是对的。很多人不愿意留下他们投反对票的原因。
        • @MongZhu 谢谢你写答案的提示,下次我回答问题时会记住这些要点。
        【解决方案5】:
        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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多