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

如何解决CS0030错误:无法将int类型转换为泛型T类型?

解决CS0030:无法将int转换为类型T的问题

错误根源

直接通过(T)(i+1)将整数强制转换为泛型枚举类型T,在C#的泛型约束中,即使指定where T:System.Enum,编译器也不允许这种直接类型转换——因为它无法确定T的底层数值类型是否与int兼容。此外你的代码还有几处语法和逻辑错误,一并修正。

修正后的完整代码

public enum TOOLS
{
    HAMMER = 1,
    DRILL = 2,
    SCREWDRIVER = 3,
    VACUUM = 4
}

public enum EQUIPMENTS
{
    MOWER = 1,
    TRIMMER = 2,
    SNOWBLOWER = 3
}

// 修正:将MyTool改为泛型类,补全语法缺失
public abstract class MyTool<T> where T : System.Enum
{
    protected T _myStuff;
    int quantity;
    double price;

    public MyTool(T t)
    {
        _myStuff = t;
    }

    // 补充属性示例
    public T MyStuff => _myStuff;
    public int Quantity { get => quantity; set => quantity = value; }
    public double Price { get => price; set => price = value; }
}

// 修正:继承时大小写匹配,数组类型修正,转换方式替换
public abstract class MyTools<T> : MyTool<T> where T : System.Enum
{
    protected MyTool<T>[] _myTools;
    public MyTool<T> this[int i] => _myTools[i];

    public MyTools(int count, T t) : base(t)
    {
        // 修正:数组类型改为MyTool<T>,而非MyTools<T>
        _myTools = new MyTool<T>[count];
        for (int i = 0; i < count; i++)
        {
            // 关键修正:用Enum.ToObject实现整数到枚举的安全转换
            var enumValue = (T)Enum.ToObject(typeof(T), i + 1);
            // 抽象类无法直接实例化,需用具体子类创建对象
            _myTools[i] = new ToolItem<T>(enumValue);
        }
    }
}

// 补充:MyTool<T>的具体子类,用于实例化对象
public class ToolItem<T> : MyTool<T> where T : System.Enum
{
    public ToolItem(T t) : base(t) { }
}

关键修改点说明

  1. 基类泛型修正:原MyTool未声明为泛型却使用了T,改为MyTool<T>并添加枚举约束。
  2. 大小写修正:继承时myTool<T>改为MyTool<T>,C#对大小写敏感。
  3. 数组类型修正:_myTools是MyTool<T>[]类型,实例化时需匹配类型,而非MyTools<T>。
  4. 枚举转换方式:用Enum.ToObject(typeof(T), i+1)替代直接强制转换,这是泛型场景下整数转枚举的标准安全方式。
  5. 抽象类实例化问题:原代码试图直接给数组赋值枚举值,但MyTool<T>是抽象类无法实例化,因此补充了具体子类ToolItem<T>来创建对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:55:18