为什么我不能做以下事情?
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'。
它没有匹配类型,但它有一个该类型的子类。
答案 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
{
}