You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Array.Copy引发ArgumentException异常的原因及解决方法(WPF)

问题原因分析

这个System.ArgumentException异常的核心原因很明确:你要复制的源数组长度超过了目标数组的容量。

看你的构造函数代码:

  • 你先初始化了目标数组this.Wh_PhnNum_List为固定长度CommandDefine.MAX_SIZE.MAX_PHN_NUM_STR_SZ
  • 然后直接用Wh_PhnNum_List.Length作为复制长度执行Array.Copy

如果传入的Wh_PhnNum_List参数的长度大于MAX_PHN_NUM_STR_SZ,目标数组根本装不下这么多元素,自然就会抛出"Destination array was not long enough"的异常。

另外还有个潜在的不一致点:你计算payload_length时用的是MAX_WH_PHNNUM_LIST_STR_SZ,但初始化目标数组用的是MAX_PHN_NUM_STR_SZ,这两个常量如果数值不同,也可能间接导致问题(比如你误以为目标数组长度是MAX_WH_PHNNUM_LIST_STR_SZ,实际却是更小的MAX_PHN_NUM_STR_SZ)。

解决方法

针对这个问题,有几种可行的修复方案,你可以根据业务需求选择:

1. 安全截断复制(推荐)

如果业务允许截断过长的输入数组,那么复制前先取源数组长度和目标数组长度的较小值,避免超出容量:

public st_SOTA_Authen_Config(char[] Wh_PhnNum_List)
{
    this.Wh_PhnNum_List = new char[CommandDefine.MAX_SIZE.MAX_PHN_NUM_STR_SZ];
    Common.InitToZero(ref this.Wh_PhnNum_List);
    
    // 计算安全的复制长度,取两者的最小值
    int safeCopyLength = Math.Min(Wh_PhnNum_List.Length, this.Wh_PhnNum_List.Length);
    Array.Copy(Wh_PhnNum_List, this.Wh_PhnNum_List, safeCopyLength);
    
    // 如果源数组更短,确保剩余位置保持为0(可选,取决于你的初始化逻辑)
    if (safeCopyLength < this.Wh_PhnNum_List.Length)
    {
        Array.Fill(this.Wh_PhnNum_List, '\0', safeCopyLength, this.Wh_PhnNum_List.Length - safeCopyLength);
    }
    
    this.payload_length = CommandDefine.MAX_SIZE.MAX_WH_PHNNUM_LIST_STR_SZ + (sizeof(byte) *3);
}

2. 提前校验输入并抛出明确异常

如果业务不允许截断(比如输入数组长度必须小于等于目标数组容量),那么在复制前先校验,抛出更清晰的异常提示:

public st_SOTA_Authen_Config(char[] Wh_PhnNum_List)
{
    if (Wh_PhnNum_List.Length > CommandDefine.MAX_SIZE.MAX_PHN_NUM_STR_SZ)
    {
        throw new ArgumentOutOfRangeException(nameof(Wh_PhnNum_List), 
            $"输入的电话号码列表长度超过最大限制{CommandDefine.MAX_SIZE.MAX_PHN_NUM_STR_SZ}");
    }
    
    this.Wh_PhnNum_List = new char[CommandDefine.MAX_SIZE.MAX_PHN_NUM_STR_SZ];
    Common.InitToZero(ref this.Wh_PhnNum_List);
    Array.Copy(Wh_PhnNum_List, this.Wh_PhnNum_List, Wh_PhnNum_List.Length);
    
    this.payload_length = CommandDefine.MAX_SIZE.MAX_WH_PHNNUM_LIST_STR_SZ + (sizeof(byte) *3);
}

3. 修正常量不一致问题

如果MAX_PHN_NUM_STR_SZ是写错了,目标数组应该和payload_length用的MAX_WH_PHNNUM_LIST_STR_SZ保持一致,那么直接修改数组初始化的长度:

this.Wh_PhnNum_List = new char[CommandDefine.MAX_SIZE.MAX_WH_PHNNUM_LIST_STR_SZ];

这样目标数组容量和你计算payload的逻辑匹配,也能避免长度不足的问题(前提是这个常量的数值确实符合你的业务需求)。

内容的提问来源于stack exchange,提问作者sahana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:09:37