首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回接口实现中的C#编译器错误

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

Stack Overflow用户
提问于 2013-08-03 02:27:44
回答 1查看 219关注 0票数 0

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

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

请注意,我不是要求某人重新定义编译器错误,只是告诉我与编译器相同的事情,或者说"...the编译器不支持它“,也不是问如何”修复“代码以使其编译(我可以通过取消注释示例中所示的方法来做到这一点)。

我试图理解代码不编译的基本原理。如果有人能指出C#规范中解决这个问题的位置,那就太好了。

按照我的想法,代码应该是有效的,因为:

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

诚然,#2是一个相当模糊的理由,我不想进入一个哲学的讨论。我真的在找一个技术上的原因,为什么它不起作用。

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

代码语言:javascript
复制
  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();
     //}
  }
EN

回答 1

Stack Overflow用户

发布于 2013-08-03 02:56:22

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

你想解决什么问题?为什么“MyClass”中的“传递”不能返回'IDoSomething‘的一个实例?或者像你上面做的那样使用超载。我不知道你为什么需要这个功能。我认为C#不支持这个特性,因为不需要它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18028661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档