2013-08-03 57 views
0

我想了解为什么下面的代码不能编译。我得到的错误是:C#编译器返回接口执行错误

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

这里解释:http://stackoverflow.com/questions/5709034/does-c-sharp-support-return-type-covariance/5709191#5709191 – nhrobin

回答

2

的问题是“MyClass的”不实现该接口,因为“交付()的返回类型比的返回类型不同的“交付()”中的接口。您可以争辩说,由于多态性,它在技术上满足界面的要求,但这并不意味着编译器必须支持该功能。

你想解决什么问题?为什么'MyClass'中的'Deliver'不能返回'IDoSomething'的实例?或者像上面那样使用超载。我不确定为什么你需要这个功能。我认为这个功能不被C#支持,因为它不需要它。