非通用接口作为通用接口的同义词

时间:2010-10-27 08:59:21

标签: c# generics interface

我在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

2 个答案:

答案 0 :(得分:2)

您的具体示例不适用于您的课程:

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()

另外,我只是挑剔:“可枚举”!=“列表”:P

答案 1 :(得分:1)

如果您希望IMyItemsList实现这两个接口,则不能将IMyGenericList<out T>接口继承自MyList<T>接口。但您可以修改您的IMyItemsList接口,如下所示:

public interface IItem
{
}

public interface IMyItemsList
{
    IEnumerable<IItem> GetList();
}

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

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

    IEnumerable<IItem> IMyItemsList.GetList()
    {
        return this.GetList().Cast<IItem>();
    }
}