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