【问题标题】:Unhandled Exception: System.ArgumentException: Cannot widen from source type to target type未处理的异常:System.ArgumentException:无法从源类型扩大到目标类型
【发布时间】:2019-12-18 22:52:51
【问题描述】:

以下脚本有未处理的异常。未处理的异常:System.ArgumentException:无法从源类型扩展到目标类型,因为源类型不是原始类型或无法完成转换。有人知道吗?我设置断点。这是 setvalue 行给我这个错误。但我不知道怎么了。

    System.Array pixelDataO;
    IPixelBlock3 pBlockO_3 = (IPixelBlock3)pBlockO;
    pixelDataO = (System.Array)pBlockO_3.get_PixelData(0);
   // Console.WriteLine(pixelDataO);
    int maxy = -1;
    Console.WriteLine("going rastermerge");
    //loop through each pixel in the pixelblock and do calculation
    for (int x = 0; x < pBlock1_3.Width; x++)
    {
        for (int y = 0; y < pBlock1_3.Height; y++)
        {
            // check to see if it's a valid data  point
            object oval1 = pBlock1_3.GetVal(0, x, y);
            object oval2 = pBlock2_3.GetVal(0, x, y);
            object oval3 =null;
            if (oval1 != null && oval2 != null)
            {
                //Console.WriteLine(oval1);
                int val1 = Convert.ToByte(oval1);
                //Console.WriteLine("finish");
                // set out of range values to 1
                if (val1 < 1 || val1 > 5) val1 = 1;
                // S5 must be coded as a 4
                if (val1 == 5) val1 = 4;
                int val2 = Convert.ToByte(oval2); ;
                //          int val3 = 10 * slval[val1] + val2;
                int val3 = 10 * val1 + val2;
                if (val3 > 10 && y > maxy) maxy = y;
                oval3 = Convert.ToSByte(val3);
                //Console.WriteLine(oval3);
            }
            Console.WriteLine(oval3);
            pixelDataO.SetValue(oval3, x, y);
        }
    }

【问题讨论】:

  • 您好,欢迎来到 SO!你有没有在你的代码中设置断点,错误出现在哪一行?
  • pixelDataO.SetValue(oval3, x, y);这行给了我错误。
  • 你能检查一下pixelDataO 的类型吗,看起来你正在处理一个二维数组......所以这个定义应该类似于(byte[], int, int)
  • 是的,它是一个 System.SByte[,]
  • 试试oval3 = Convert.ToSByte(val3);,它将把它转换成一个8位有符号整数,而不是一个8位无符号整数... 8 位无符号转换为 8 位有符号,这不适合,因此,加宽错误。

标签: c# unhandled-exception


【解决方案1】:

未处理的异常:System.ArgumentException:无法从源类型扩展到目标类型,因为源类型不是原始类型或无法完成转换

这是因为您试图填充无法转换为目标类型的类型。让我们看看你的代码...

走这条线:pixelDataO = (System.Array)pBlockO_3.get_PixelData(0);

我在评论中询问这是什么类型,pBlockO_3.get_PixelData(0); 返回什么?根据评论,是System.SByte[,]

在你的代码中,特别是你所在的循环中,你有:

 oval3 = Convert.ToByte(val3);

当你这样做时,你会得到一个8-bit-unsigned integer。接下来,您将尝试为二维pixelDataO 数组中指定位置的元素设置一个值。

 pixelDataO.SetValue(oval3, x, y);

问题是oval3 不是System.SByte 它是8-bit unsigned integer;错误的类型以及无法扩大的原因。

要解决此问题,您需要使用Convert.ToSByte()

现在这一行,oval3 = Convert.ToByte(val3);变成了

  oval3 = Convert.ToSByte(val3);

另一方面,您可能还需要调整其他代码,因为您可能会再次遇到问题,具体取决于您对其他字段所做的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    相关资源
    最近更新 更多