我试图理解为什么下面的代码无法编译。我得到的错误是:
“MyClass”没有实现接口成员“IFace.Deliver()”。“MyClass.Deliver()”无法实现“IFace.Deliver()”,因为它没有匹配的返回类型“IDoSomething”。
请注意,我不是要求某人重新措辞编译器错误,只是告诉我与编译器相同的事情,或者说“......编译器不支持它”,我也不是问如何“修复”代码以使其编译(我可以通过取消注释示例中显示的方法来做到这一点)。
我试图了解代码未编译的基本原理。如果有人可以将我指向 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();
//}
}