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

如何将泛型类FooInt转换为Foo<object>并保留重写实现?

如何将Foo<int>转换为Foo<object>并保留重写实现

问题核心原因

C#中默认泛型类是不变的——即便int是object的子类,Foo<int>和Foo<object>之间也不存在继承或兼容关系,这直接导致你之前的转换尝试全部失败:

  • 隐式转换递归:(Foo<object>)field会触发你定义的转换方法,无限递归后引发栈溢出
  • as转换返回null:Foo<int>不是Foo<object>的派生类型,转换失败返回null
  • 先转object再强转:object是所有类型的基类,但无法直接将Foo<int>实例拆箱为Foo<object>

解决方案

方案1:将抽象类改为支持协变的接口(推荐)

你的Foo<T>中DoSomething()方法仅返回T(属于输出位置),完全符合协变的适用条件。只需将抽象类改为带out关键字的泛型接口:

public interface IFoo<out T> {
    T DoSomething();
}

public class FooInt : IFoo<int> {
    public int DoSomething() {
        return 42;
    }
}

此时IFoo<int>可直接赋值给IFoo<object>,协变会自动处理类型兼容:

List<IFoo<object>> fooList = new List<IFoo<object>>();
fooList.Add(new FooInt()); // 直接添加,无需额外转换

方案2:创建包装类适配类型(无法修改原类时使用)

如果不能改动原有Foo<T>抽象类,可以通过包装类将Foo<T>实例适配为Foo<object>,同时保留原实现逻辑:

public class FooObjectWrapper<T> : Foo<object> {
    private readonly Foo<T> _innerInstance;

    public FooObjectWrapper(Foo<T> innerInstance) {
        _innerInstance = innerInstance ?? throw new ArgumentNullException(nameof(innerInstance));
    }

    public override object DoSomething() {
        // 调用原实例方法,返回值自动装箱为object
        return _innerInstance.DoSomething();
    }
}

使用时通过包装类完成转换:

var fooInt = new FooInt();
Foo<object> wrappedFoo = new FooObjectWrapper<int>(fooInt);
List<Foo<object>> fooList = new List<Foo<object>>();
fooList.Add(wrappedFoo);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:16