C#创建混合类型二维数组遇CS0029错误,求数组解决方案
C# 混合数据类型二维数组解决方案(仅用数组)
问题背景
需要在C#中创建多个支持混合数据类型的二维数组,用于存储从数据库获取的数据。尝试通过定义包含多类型属性的类来实现,但触发了一系列类型转换错误:
- CS0029 无法将类型“Client.Aggregate.Arrays”隐式转换为“int”
- CS0029 无法将类型“Client.Aggregate.Arrays”隐式转换为“System.DateTime”
- CS0029 无法将类型“Client.Aggregate.Arrays”隐式转换为“string”
- 反向转换错误:无法将int/DateTime等基础类型隐式转换为“Client.Aggregate.Arrays”
现有代码
自定义类代码
public class Arrays { public string String { get; set; } public char C { get; set; } public int Int { get; set; } public double Double { get; set; } public DateTime DateTime { get; set; } }
业务使用代码
void Calculation(Arrays[,] SupArray, Arrays[,] Source) { DateTime ValidDate = Source[2, 2]; string LineName = SupArray[4, 10]; string LineModel = SupArray[6, 71]; // 测试代码:双向类型转换均报错 Arrays[,] DArray = new Arrays[50, 50]; DArray[1, 3] = "DMG"; DArray[1, 2] = "Y"; DArray[1, 4] = 4126; DArray[1, 1] = new DateTime(2019, 12, 30); }
需求限制:仅接受基于数组的解决方案,不使用列表或字典。
解决方案
核心问题解析
之前的错误在于混淆了数组元素类型:Arrays[,]的每个元素是Arrays类的实例,而非直接存储基础类型值。以下是两种符合要求的实现方式:
方式1:类型安全的自定义类数组
通过完善自定义类的构造和属性访问逻辑,实现类型安全的混合数据存储:
优化后的自定义类
// 重命名类避免与数组关键字冲突 public class MixedDataType { public string StringVal { get; set; } public char CharVal { get; set; } public int IntVal { get; set; } public double DoubleVal { get; set; } public DateTime DateTimeVal { get; set; } // 为常用类型添加构造函数,简化实例创建 public MixedDataType(string val) => StringVal = val; public MixedDataType(char val) => CharVal = val; public MixedDataType(int val) => IntVal = val; public MixedDataType(double val) => DoubleVal = val; public MixedDataType(DateTime val) => DateTimeVal = val; }
正确使用示例
void Calculation(MixedDataType[,] SupArray, MixedDataType[,] Source) { // 取值时需访问对应类型的属性 DateTime ValidDate = Source[2, 2].DateTimeVal; string LineName = SupArray[4, 10].StringVal; string LineModel = SupArray[6, 71].StringVal; MixedDataType[,] DArray = new MixedDataType[50, 50]; // 通过构造函数创建实例并赋值 DArray[1, 3] = new MixedDataType("DMG"); DArray[1, 2] = new MixedDataType('Y'); DArray[1, 4] = new MixedDataType(4126); DArray[1, 1] = new MixedDataType(new DateTime(2019, 12, 30)); }
方式2:object类型二维数组
如果可以接受编译期无类型检查,直接使用object[,]是最直接的混合类型数组实现:
使用示例
void Calculation(object[,] SupArray, object[,] Source) { // 取值时需显式转换为目标类型 DateTime ValidDate = (DateTime)Source[2, 2]; string LineName = (string)SupArray[4, 10]; string LineModel = (string)SupArray[6, 71]; object[,] DArray = new object[50, 50]; // 直接赋值任意类型数据 DArray[1, 3] = "DMG"; DArray[1, 2] = 'Y'; DArray[1, 4] = 4126; DArray[1, 1] = new DateTime(2019, 12, 30); }
注意事项
object数组会产生装箱/拆箱性能开销,且编译时无法检测类型错误,需确保运行时转换的类型正确性。- 若需要类型安全保障,优先选择方式1的自定义类方案。
内容的提问来源于stack exchange,提问作者Zay
相关产品推荐
相关产品推荐

