簡體   English   中英

返回接口實現時的C#編譯器錯誤

[英]C# Compiler Error on Returning Interface Implementation

我試圖理解為什么下面的代碼不能編譯。 我得到的錯誤是:

'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();
     //}
  }

問題是'MyClass'沒有實現接口,因為'Deliver()'的返回類型與接口中的'Deliver()'的返回類型不同。 您可以爭辯說,由於多態性,它在技術上滿足了接口的要求,但這並不意味着編譯器必須支持該功能。

你想解決什么問題? 為什么“MyClass”中的'Deliver'不能只返回'IDoSomething'的實例? 或者像上面一樣使用重載。 我不確定你為什么需要這個功能。 我認為C#不支持此功能,因為不需要它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM