我在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
答案 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>();
}
}