C# 非泛型接口作为泛型接口的同义词

C# 非泛型接口作为泛型接口的同义词,c#,generics,interface,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 I

我在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,其中T:IItem
{
IEnumerable GetList();
}
公共类MyList:IMyGenericList,其中T:IItem
{
公共IEnumerable GetList()
{
返回null;
}
}

它工作得很好。大多数时候我需要
imygenericslist
,因此我尝试以下方法:

public interface IMyItemsList : IMyGenericList<IItem>
{
}
公共接口IMyItemsList:IMyGenericList
{
}
但由于某些原因,我无法使我的列表实现IMyItemsList。下面的代码返回一个错误

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem
{
    public IEnumerable<T> GetList()
    {
        return null;
    }
}
公共类MyList:IMyItemsList,IMyGenericList其中T:IItem
{
公共IEnumerable GetList()
{
返回null;
}
}
表示未实现
IEnumerable

为什么会这样/我能用这个做什么? 谢谢

好吧,多亏了你的回答,我才发现不可能完全按照我最初的想法去做。我将发布另一个关于为什么这是不可能的问题:)
这里是:

如果您想让
MyList
同时实现这两个功能,就不能让您的
IMyItemsList
接口继承自
imygenericslist
接口。但您可以修改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>();
    }
}
公共接口项目
{
}
公共接口IMyItemsList
{
IEnumerable GetList();
}
公共接口IMyGenericList,其中T:IItem
{
IEnumerable GetList();
}
公共类MyList:IMyGenericList、IMyItemsList
T:项目在哪里
{
公共IEnumerable GetList()
{
返回null;
}
IEnumerable IMyItemsList.GetList()
{
返回此.GetList().Cast();
}
}

您的特定示例不起作用,因为您的类:

public class MyList<T> : IMyItemsList, IMyGenericList<T> where T : IItem
{
  public IEnumerable<T> GetList()
  {
    return null;
  }
}
编译器将尝试创建一个具体的
MyList
实现,它将有两个
IEnumerable GetList()
的定义

我将重新考虑您对单个
IEnumerable GetList()
求值的设计


另外,我也很挑剔:“可枚举”!=“list”:P

您的
GetEnumerator
方法在哪里?我没有实现IEnumerable,我只是返回一个类型为“大多数时候我需要
IMyGenericList
”的值。只有在类型约束下才能有这样的结果。imho,IEnumerable,其中T:IItem可以始终强制转换为IEnumerable,不是吗?我想,这就是协方差在.net中的作用?我同意你的看法,它看起来很难看,如果有一个单独的显式IEnumerable GetList()实现,就会导致问题
var list = new MyList<IItem>();