【发布时间】:2011-11-03 13:59:36
【问题描述】:
根据 CSharp 语言规范。
接口定义了一个可以由类实现的契约,并且 结构。接口不提供成员的实现 它定义了——它仅仅指定了必须由 实现接口的类或结构。
所以我有这个:
interface ITest
{
IEnumerable<int> Integers { get; set; }
}
我的意思是。 “我与一个属性签订了一个合同,该属性是您可以枚举的整数集合”。
那我想要下面的接口实现:
class Test : ITest
{
public List<int> Integers { get; set; }
}
我得到以下编译器错误:
'Test' 没有实现接口成员'ITest.Integers'。 'Test.Integers' 不能实现 'ITest.Integers' 因为它没有 具有匹配的返回类型 'System.Collections.Generic.IEnumerable'。
只要我可以说我的 Test 类实现了 ITest 契约,因为 int 属性的 List 实际上是 int 的 IEnumerable。
那么 c# 编译器告诉我错误的方式是什么?
【问题讨论】:
-
签名不一样。如果要实现接口,则需要同样实现(协变/逆变泛型类型参数除外)。
-
同上詹姆斯所说的
IEnumerable<int> != List<int> -
如果您只想要“get”,理论上应该是可能的。请参阅下面 Eric Lippert 的帖子,了解如何在 c# 中实现这一点。在某些情况下,也可以只创建两个方法,一个称为 IntegerList,一个称为 IntegerEnumerable..,然后 IntegerEnumerable 实现在内部调用另一个方法。
标签: c#