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

时间:2013-08-03 02:27:45

标签: c# interface implementation explicit

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

  

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

请注意,我并不是要求某人重新编写编译器错误并简单地告诉我与编译器相同的事情,或者说“......编译器不支持它”,也不是我问如何“修复”代码以使其编译(我可以通过取消注释示例中显示的方法来实现)。

我试图理解代码中没有编译的基本原理。如果有人能指出我在C#规范中解决此问题的位置,那将是完美的。

以我的思维方式,代码应该有效,因为:

  1. 这在逻辑上是有效的。 ThisOrThat对象是IDoSomething的正确实现(除非我遗漏了一些微妙的问题)。
  2. 这与多态性的精神是一致的。如果方法声明为返回接口,则它必须返回实现接口的具体类的实例。为什么它应该是无效的,因为同一个方法被声明为返回一个实现接口的具体类?编译器当然可以验证类的实现。 (是的,我已经知道编译器不会批准。)
  3. 不可否认,#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();
         //}
      }
    

1 个答案:

答案 0 :(得分:2)

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

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