C#编译器返回接口实现时出错

本文关键字:出错 实现 接口 编译器 返回 | 更新日期: 2023-09-27 18:26:16

我试图理解为什么下面的代码没有编译。我得到的错误是:

"MyClass"未实现接口成员"IFace.EDeliver()"。"MyClass.EDeliver)"无法实现"IFace.Drive())",因为它没有匹配的返回类型"IDoSomething"。

请注意,我并不是要求有人重新输入编译器错误,然后简单地告诉我与编译器相同的事情,或者说"…编译器不支持它",也不是要求如何"修复"代码以使其编译(我可以通过取消对示例中所示方法的注释来做到这一点)。

我试图理解代码中不编译的理由。如果有人能在C#规范中为我指出一个解决这个问题的位置,那将是完美的。

在我看来,代码应该是有效的,因为:

  1. 它在逻辑上是有效的。ThisOrThat对象是IDoSomething的正确实现(除非我遗漏了一些微妙的问题)
  2. 这符合多态性的精神。如果一个方法被声明为返回接口,那么它必须返回实现该接口的具体类的实例。那么,为什么将同一方法声明为返回实现接口的具体类是无效的呢?编译器当然可以验证类的实现。(是的,我已经知道编译器不同意。)

无可否认,#2是一个相当模糊的原因,我不想进入哲学讨论。我真的在寻找它不起作用的技术原因。

正如我所说,我知道我需要做什么来"修复"它,但我真的想明白为什么它不应该按照编写的方式编译。

  interface IFace {
     IDoSomething Deliver();
  }
  interface IDoSomething {
  }

  class ThisOrThat : IDoSomething {
  }

  class MyClass : IFace {
     public ThisOrThat Deliver() {
        return new ThisOrThat();
     }
     // Uncomment the lines below to make it compile.
     //IDoSomething IFace.Deliver() {
     //   return Deliver();
     //}
  }

C#编译器返回接口实现时出错

问题是"MyClass"没有实现接口,因为"Deliver()"的返回类型与接口中的"Deliver"()的返回类型不同。您可以说,由于多态性,它在技术上满足了接口的要求,但这并不意味着编译器必须支持该功能。

你想解决什么问题?为什么"MyClass"中的"Deliver"不能只返回"IDoSomething"的实例?或者像上面那样使用重载。我不知道你为什么需要这个功能。我认为C#不支持这个功能,因为不需要它。