以下のコードがコンパイルされない理由を理解しようとしています。私が得るエラーは次のとおりです。
'MyClass' はインターフェイス メンバー 'IFace.Deliver()' を実装していません。'MyClass.Deliver()' は、'IDoSomething' の一致する戻り値の型を持たないため、'IFace.Deliver()' を実装できません。
誰かにコンパイラ エラーを言い換えて、単にコンパイラと同じことを教えてほしい、または「...コンパイラはそれをサポートしていません」と言うように頼んでいるわけではないことに注意してください。コードを「修正」してコンパイルします (例に示されているメソッドのコメントを外すことで実行できます)。
コンパイルされていないコードの理論的根拠を理解しようとしています。誰かがこの問題に対処する C# 仕様の場所を教えてくれれば、それは完璧です。
私の考え方では、次の理由により、コードは有効である必要があります。
- それは論理的に有効です。ThisOrThat オブジェクトは、IDoSomething の適切な実装です (見落としている微妙な問題がない限り)。
- それはポリモーフィズムの精神と一致しています。メソッドがインターフェイスを返すように宣言されている場合、インターフェイスを実装する具象クラスのインスタンスを返す必要があります。同じメソッドがインターフェイスを実装する具象クラスを返すものとして宣言されるのはなぜ無効なのでしょうか? コンパイラは確実にクラスの実装を検証できます。(そして、はい、コンパイラが承認しないことは既に知っています。)
確かに、#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();
//}
}