C#继承报错:值类型需为object以匹配重写成员的解决办法
问题描述
我定义了一个包含返回object类型抽象方法的抽象类:
public abstract class MyAbstractClass { public abstract object MyAbstractMethod(); }
使用引用类型(如string)实现该类时可正常运行:
public class MyClass : MyAbstractClass { public override string MyAbstractMethod() { return "Hi StackOverflow !!!"; } }
但尝试使用bool、int等值类型实现时:
public class MyClass : MyAbstractClass { public override bool MyAbstractMethod() { return true; } }
会报错:
type must be 'object' to match overridden member
我知道报错原因是值类型并非object类型,但如何在不将值类型包装为object的前提下解决该问题?是否可行?
解决方案
可行,使用泛型抽象类就能解决这个问题,无需对值类型进行装箱操作。
将抽象类修改为泛型版本,让返回类型由泛型参数指定:
public abstract class MyAbstractClass<T> { public abstract T MyAbstractMethod(); }
这样不管是引用类型还是值类型,都可以直接实现:
- 引用类型(string)实现:
public class StringClass : MyAbstractClass<string> { public override string MyAbstractMethod() { return "Hi StackOverflow !!!"; } }
- 值类型(bool)实现:
public class BoolClass : MyAbstractClass<bool> { public override bool MyAbstractMethod() { return true; } }
- 值类型(int)实现:
public class IntClass : MyAbstractClass<int> { public override int MyAbstractMethod() { return 42; } }
泛型能在编译时确定返回类型,既避免了值类型装箱的性能开销,又能严格保证类型安全,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

