我正在实现需要具有以下签名的方法GetList()的IListSource:
IList GetList()我使用的是.NET Framework2,我想返回一个实现IList的对象,如下所示:
public System.Collections.IList GetList()
{
return this._mydata; // Implements IList<MyDataRow>
}但是我得到了一个编译错误:Cannot implicitly convert type MyData to System.Collections.IList。
如果我创建一个List<MyDataRow>类型的新列表,填充它并返回这个列表对象,那么它就可以工作了。因此,换句话说,这是可行的:
public System.Collections.IList GetList()
{
List<MyDataRow> list = new List<MyDataRow>();
foreach (MyDataRow row in this._mydata)
{
list.Add(row);
}
return list;
}但是,仅仅为了将其从IList<T>类型转换为IList,必须重新创建列表似乎效率很低。为什么可以返回List<MyDataRow>' from 'GetList(),却不能返回IList<MyDataRow>?有没有人知道一种不用重新填充列表就能返回IList<MyDataRow>的方法?
更新:
声明_mydata成员变量:
private MyData _mydata;并且声明了MyData:
public class MyData : IList<MyDataRow>
{
....
}发布于 2012-09-19 21:42:30
为什么我可以从
GetList()返回List<MyDataRow>,但不能返回IList<MyDataRow>
这是因为List<T>实现了IList,IList<T>不能转换为IList,它们是两个独立的接口。所以我来回答你的问题:
有没有人知道一种不用重新填充列表就能返回
IList<MyDataRow>的方法?
如果具体类型实现了IList ( List<T>确实实现了),那么您可以显式地转换它,例如
return (IList)this.mydata;更新
根据您的更新,您将不得不更新MyData以实现IList,否则您别无选择,只能返回一个实现它的新集合。
或者,如果MyData确实是一个通用列表,那么我建议你从List<T>继承它,这样你就可以获得更多的灵活性和兼容性,例如
class MyData : List<MyDataRow>
{
}发布于 2012-09-19 21:45:48
MyData类需要实现IList以及通用版本的IList<T>。
class MyData : IList<MyDataRow>, IList
{
}发布于 2012-09-19 21:54:17
IList<T>没有扩展IList,因为期望泛型版本的每个实现都提供与非泛型版本相同的约定是不合理的。如果它确实扩展了IList,那么有人可以获取从GetList返回的值,并合理地期望调用,例如Add(DateTime.Now)或Add(Thread.CurrentThread)。这就是IList承诺的。
这就是将列表复制到List<T> works - List<T>实现这两个接口的原因,并在使用不适当的参数类型调用其(显式实现的) IList方法时抛出异常。
如果您可以通过返回IEnumerable逃脱惩罚,那么就这么做吧。如果您可以返回IList<MyDataRow>,那么就这样做。如果您确实需要非泛型IList返回,那么实现该接口并适当地处理非MyDataRow值。
https://stackoverflow.com/questions/12495910
复制相似问题