为什么我不能这样实现接口?
可能重复:
C#是否支持返回类型协方差?
我不确定我是不是真的很蠢……
如果我有一个界面:
public interface IMoop { object Moop(); }
为什么我不能这样实现它(我想这会使用隐式协方差?)
public class MoopImplementor : IMoop { string Moop(); }
MoopImplementor的任何实例都符合IMoop指定的合同,所以看起来这应该没问题。
请赐教:)
编辑:要清楚 – 因为实现类返回inheritance自Interfaced方法的返回类型的东西 – 我觉得这应该有效。 具体来说, string
是一个object
。 (对于任何其他的承保链也是如此)。
出于接口实现或虚拟方法覆盖的目的,C#不支持返回类型协方差 。 有关详细信息,请参阅此问
C#是否支持返回类型协方差?
C#支持从C#4 类型参数的引用类型构造的接口和委托类型的通用协方差和逆变 。
当将返回引用类型的方法转换为返回类型为兼容引用类型的委托类型时,C#确实支持返回类型协方差 。 (同样它支持参数类型逆变 。)
如果这个主题让你感兴趣,我写了很多文章讨论C#所做和不支持的各种版本的差异。 看到
https://blogs.msdn.microsoft.com/ericlippert/tag/covariance-and-contravariance/
详情。
因为接口指定方法必须返回一个object
。 string
可以从object
inheritance,但接口指定返回更通用类型的方法。
但请记住,没有什么可以阻止您执行以下操作:
public object Moop() { return "Some new string"; }
合理的解决方法:
public class MoopImplementor : IMoop { public string Moop() { ... } object IMoop.Moop() { return Moop(); } }
这允许MoopImplementor
上的公共实现具有更准确的类型,同时仍满足接口的要求。
你没有达到合同。 但是,您可以使用generics来执行此操作:
public interface IMoop { T Moop(); } public class MoopImplementor : IMoop { public string Moop() { return ""; } }
来自C#语言规范 :
13.4.4接口映射
出于接口映射的目的,类成员A在以下情况下匹配接口成员B:
- A和B是方法,A和B的名称, 类型和forms参数列表是相同的 。
请注意,它没有说inheritance或可转换性! 返回类型必须相同。