c#对派生接口中继承接口的泛型接口进行专门化

本文关键字:接口 泛型接口 专门化 继承 派生 | 更新日期: 2023-09-27 18:15:57

我想不出一个更好的标题,所以我想用一个例子来解释:

我有两个类。一个源自另一个:

public class Base { }
public class Derived : Base { }

和两个接口。同样,一个派生于另一个,并且都实现了两个类之一的枚举:

public interface BaseEnumeration : IReadOnlyList<Base> { }
public interface DerivedEnumeration : BaseEnumeration, IReadOnlyList<Derived> { }

它编译得很好(尽管我必须在DerivedEnumeration中实现两次GetEnumerator),但是当我试图使用它们的函数时,编译器抱怨两个接口之间的歧义。

我已经尝试创建了一个泛型基接口,但是无法从更远的派生接口强制转换为派生接口。

那么我该如何解决这个问题呢?

c#对派生接口中继承接口的泛型接口进行专门化

你试图解决这个问题的方式是行不通的。首先让我说,这有点奇怪,你需要在一个类型定义中收集Base类和Derived类。但我不会把重点放在那部分,因为那是你的。无论. .要枚举BaseDerived集合,您需要在接口中显式地定义它们,如下所示:

public interface IBaseEnumeration {
    IReadOnlyCollection<Base> BaseCollection { get; }
}
 public interface IDerivedEnumeration : IBaseEnumeration {
    IReadOnlyCollection<Derived> DerivedCollection { get; }
}

,但Derived源自Base的事实将导致只使用第一个接口IBaseEnumeration : IReadOnlyCollection<Base>的解决方案,因为Base涵盖了两种实例类型。