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

将结构体数组转换为接口数组报错,求可行解决方法

结构体数组转接口数组的解决方案

C#里数组协变仅支持引用类型之间的转换,这就是为什么Class[]能直接转ISomeInterface[],但Struct[]不行的核心原因:

  • 引用类型数组存储的是对象引用,转接口数组时只是改变了引用的类型,底层存储结构不变;
  • 值类型数组存储的是未装箱的结构体实例,而接口类型需要引用装箱后的对象,二者存储结构完全不兼容,所以直接强制转换会失败。

以下是几种可行的解决方法:

方法1:使用LINQ的Cast方法

通过LINQ逐个将结构体装箱为接口类型,再生成新数组:

interfaceArr = structArr.Cast<ISomeInterface>().ToArray();

方法2:手动遍历转换

手动创建接口数组,逐个将结构体赋值(赋值时会自动触发装箱操作):

interfaceArr = new ISomeInterface[structArr.Length];
for (int i = 0; i < structArr.Length; i++)
{
    interfaceArr[i] = structArr[i];
}

方法3:使用Array.ConvertAll

利用.NET内置的数组转换方法,简洁完成转换:

interfaceArr = Array.ConvertAll(structArr, item => (ISomeInterface)item);

注意事项

以上方法都会生成新的接口数组,而非复用原结构体数组的内存。另外,装箱后的接口元素是原结构体的副本,修改接口数组中元素的属性(比如interfaceArr[0].name = "NewName")不会影响原structArr中的元素——因为值类型的副本修改不会同步到原实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:27