C# 非泛型接口作为泛型接口的同义词
我在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
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>();