c# - 为什么要限制方法和属性继承的返回类型以致不允许后代?

标签 c# .net

给定以下假设情况:

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/

相关文章:

c# - 欧拉计划的问题问题 12

c# - 提交试用版WP7应用

.net - 在 .NET 中断言参数和值的前置条件和后置条件的最佳方法是什么?

c# - 将 JSON 写入流而不在内存中缓冲字符串

c# - 在 ADO.NET 中获取输出参数值

c# - 如何从复杂的 SQL 创建 LINQ?

c# - 如何实现一个已经有其他接口(interface)的接口(interface)?

c# - 代码分析提示对象可以被处置不止一次。为什么?

c# - subject.OnError 抛出

c# - GC 没有完成 UserControl?