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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:46:08