0

以下のコードがコンパイルされない理由を理解しようとしています。私が得るエラーは次のとおりです。

'MyClass' はインターフェイス メンバー 'IFace.Deliver()' を実装していません。'MyClass.Deliver()' は、'IDoSomething' の一致する戻り値の型を持たないため、'IFace.Deliver()' を実装できません。

誰かにコンパイラ エラーを言い換えて、単にコンパイラと同じことを教えてほしい、または「...コンパイラはそれをサポートしていません」と言うように頼んでいるわけではないことに注意してください。コードを「修正」してコンパイルします (例に示されているメソッドのコメントを外すことで実行できます)。

コンパイルされていないコードの理論的根拠を理解しようとしています。誰かがこの問題に対処する 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

問題は、「Deliver()」の戻り値の型がインターフェイスの「Deliver()」の戻り値の型と異なるため、「MyClass」がインターフェイスを実装していないことです。ポリモーフィズムのためにインターフェースの要件を技術的に満たしていると主張することはできますが、それはコンパイラがその機能をサポートしなければならないという意味ではありません。

どのような問題を解決しようとしていますか? 「MyClass」の「Deliver」が単に「IDoSomething」のインスタンスを返すことができないのはなぜですか? または、上記のようにオーバーロードを使用してください。なぜこの機能が必要なのかわかりません。この機能は必要がないため、C# ではサポートされていないと思います。

于 2013-08-03T02:56:22.750 に答える