将结构体数组转换为接口数组报错,求可行解决方法
结构体数组转接口数组的解决方案
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
相关产品推荐
相关产品推荐

