0

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

“MyClass”没有实现接口成员“IFace.Deliver()”。“MyClass.Deliver()”无法实现“IFace.Deliver()”,因为它没有匹配的返回类型“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();
     //}
  }
4

1 回答 1

2

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

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

于 2013-08-03T02:56:22.750 回答