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

复制空数组:Mono与.NET Core的行为差异

问题原因分析与解决方案

这问题我之前排查过类似的,核心差异大概率出在.NET Core和Mono对数组协变以及Array.Copy的类型检查逻辑上,咱们一步步拆解:

1. 空数组的类型校验严格性差异

.NET里引用类型数组支持协变(比如string[]可以隐式转换为object[]),但值类型数组不行。不过针对空数组的场景,Mono的类型校验逻辑要宽松很多:

  • 当你把类型A的空数组复制到类型B的目标数组时,Mono可能直接跳过了元素类型兼容性检查——反正数组里没元素,复制0长度的内容不会有实际问题。
  • 但.NET Core的Array.Copy实现哪怕在复制长度为0时,依然会严格校验源数组和目标数组的元素类型是否兼容。如果A和B之间没有继承/实现关系,哪怕是空数组,也会抛出ArrayTypeMismatchException。

举个实际的测试案例,你可以跑一下这段代码验证:

public class TypeA {}
public class TypeB {}

// 测试复制空数组
var source = new TypeA[0];
var target = new TypeB[0];
Array.Copy(source, target, 0); // .NET Core下会抛出异常,Mono下正常

2. Array.Copy的底层实现差异

Mono的Array.Copy针对空数组的场景做了特殊优化,直接返回成功而不触发完整的类型校验流程;而.NET Core的实现则始终遵循严格的类型安全规则,不管数组是否为空,都会先验证源和目标的元素类型是否可以安全转换。

解决方案

如果你的业务逻辑确实需要处理这种“空数组跨类型复制”的场景,可以做个简单的判断绕过:

public void CopyArray<TTarget, TSource>(TSource[] source, TTarget[] target)
{
    if (source.Length == 0)
    {
        // 空数组直接赋值目标类型的空数组,避免触发类型校验
        target = Array.Empty<TTarget>();
        return;
    }
    // 非空数组时再执行正常复制(确保TSource和TTarget类型兼容)
    Array.Copy(source, target, source.Length);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:52:13