我想了解为什么下面的代码不能编译。我得到的错误是:C#编译器返回接口执行错误
'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();
//}
}
这里解释:http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance/5709191#5709191 – nhrobin