我在c#中有一个通用接口,几乎我总是将其与其中一种类型一起使用。我想为该类型创建一个非通用接口并使用它。

假设我有以下代码:

public interface IMyGenericList<out T> where T : IItem
{
    IEnumerable<T> GetList();
}

public class MyList<T> : IMyGenericList<T> where T : IItem
{
    public IEnumerable<T> GetList()
    {
        return null;
    }
}


它运作良好。大多数时候我需要IMyGenericList<IItem>,所以我尝试以下操作:

public interface IMyItemsList : IMyGenericList<IItem>
{
}


但由于某种原因,我无法使MyList实现IMyItemsList。以下代码返回错误

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem
{
    public IEnumerable<T> GetList()
    {
        return null;
    }
}


IEnumerable<IItem> is not implemented

为什么会这样/我该怎么办?
谢谢。

好的,感谢您的回答,我发现不可能完全按照我最初的意愿去做。我将发布另一个问题,为什么这是不可能的:)
在这里是:One function implementing Generic and non-generic interface

最佳答案

您的特定示例不起作用,因为您的课程是:

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem
{
  public IEnumerable<T> GetList()
  {
    return null;
  }
}


正在尝试同时实现IEnumerable<IItem> GetList()IEnumerable<T> GetList(),这是两件事。第一个是IItem的可枚举(根据您的IMyItemsList接口的要求),第二个是T的可枚举。

在这种情况下,T的类型为IItem,但不是明确的IItem。因此,在编译时,IEnumerable<IItem> GetList()不是IEnumerable<T> GetList(),因此编译器会正确抛出一个错误,告诉您未实现IEnumerable<IItem> GetList()

您将遇到的另一个问题是当有人这样做时会发生什么:

var list = new MyList<IItem>();


编译器将尝试创建MyList<IItem>的具体实现,该实现将具有IEnumerable<IItem> GetList()的两个定义。

我会重新考虑您的设计以评估单数IEnumerable<T> GetList()

另外,我也很挑剔:“ enumerable”!=“ list”:P

10-08 00:22