如何将泛型类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
相关产品推荐
相关产品推荐

