给定以下假设情况:
class ClassParent { }
interface IClassProvider { ClassParent Get(); }
为什么这是非法的 IClassProvider 实现:
class ClassChild : ClassParent, IClassProvider
{
ClassChild Get() { return this; }
}
它也不适用于继承属性和实现基类而不是示例中的接口(interface)。
ClassChild 是 ClassParent。那为什么不编译呢?编译器清楚地知道类的编译时类型,这就是以下工作的原因:
void DoSomething(object o) { ... };
void DoSomething(ConcreteClass c) { ... };
DoSomething(new ConcreteClass()); //Calls the second overload of the method because of static type resolving
在分层场景中,这迫使我拥有一堆代理方法,并且在底层情况清楚时不必要地使我的代码困惑。坦率地说,如果支持的话,我想不出任何问题或歧义。我会对编译时(静态)解析感到满意,就像它在第二个示例中处理重载一样。
编辑:我知道编译器需要以下内容:
class ClassChild : ClassParent, IClassProvider
{
ClassParent Get() { return this; }
}
而且我知道它会起作用,我要求解释为什么它不受支持或它会导致 a) 问题或 b) 歧义比支持的重载更糟糕。
编辑 2: 这似乎是 MS 自己在 this SO question 中回答的同一个老问题的另一个副本。 .我将@Euphoric 的帖子标记为答案,因为他为有助于找到“解决方案”的功能提供了名称。
最佳答案
我认为您正在寻找的功能是名称 Covariant Return Type
至于“为什么”没有实现,没人知道。 IMO 这个功能不是很需要,所以它根本没有实现。
特别是在您的情况下,可以使用 Explicit Interface Implementation 轻松解决
关于c# - 为什么要限制方法和属性继承的返回类型以致不允许后代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5050963/