为什么我不能在类替换具体类型的接口上实现接口?

时间:2014-03-12 18:58:29

标签: c# .net interface covariance

为什么我不能做以下事情?

public class TestClass : TestInterface
{
    public ClassX Property { get; private set; }
}

public interface TestInterface
{
    InterfaceX Property { get; }
}

public interface InterfaceX
{

}

public class ClassX : InterfaceX
{

}

TestInterface属性是只读的,因此只能根据合同返回InterfaceX。

但是,我得到了这个编译错误:

  

'识别TestClass'没有实现接口成员   ' TestInterface.InterfaceX&#39 ;. ' TestClass.InterfaceX'无法实施   ' TestInterface.InterfaceX'因为它没有匹配   返回类型' InterfaceX'。

它没有匹配类型,但它有一个该类型的子类。

2 个答案:

答案 0 :(得分:5)

我不知道该规范,但我确定有一个明确指出返回类型必须与完全匹配的接口实现。我能找到的最接近的是13.4.4:

  

出于接口映射的目的,类成员A在以下情况下匹配接口成员B:

     
      
  • A和B是方法,A和B的名称,类型和形式参数列表是相同的。
  •   
  • A和B是属性,A和B的名称和类型相同,A与B具有相同的访问权限(如果不是显式接口成员实现,则允许A具有其他访问者)。
  •   

如果"键入"以上是指"返回类型"这表明返回类型不能改变。

但是,您可以更改返回类型,显式使用正确的返回类型实现接口:

public class TestClass : TestInterface
{
    public ClassX InterfaceX { get; private set; }
    InterfaceX TestInterface.InterfaceX { get { return InterfaceX; } }
}

更新

根据Eric Lippert,它似乎是一个CLR限制,而不仅仅是一个C#。

答案 1 :(得分:0)

您提到要展示简化集,但是您希望该类内部具有所有功能 - 这不是您想要使用的接口。一个接口应该只是你的简化集合,而不是神奇地在内部充当整套,而不是没有另一个帮助属性。

但是,有一种方法可以解决这个限制,同时仍然可以稍微传达合同。

interface IExpose<IToolType> where IToolType : ITool
{
  IToolType Handler { get; set; }
}

class Expose : IExpose<Tool>
{
  public Tool Handler { get; set; }
}

interface ITool
{
}

class Tool : ITool
{
}