首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从IList<T>转换为非通用IList

从IList<T>转换为非通用IList
EN

Stack Overflow用户
提问于 2012-09-19 21:36:26
回答 5查看 16.6K关注 0票数 19

我正在实现需要具有以下签名的方法GetList()IListSource

代码语言:javascript
复制
IList GetList()

我使用的是.NET Framework2,我想返回一个实现IList的对象,如下所示:

代码语言:javascript
复制
public System.Collections.IList GetList()
{
    return this._mydata; // Implements IList<MyDataRow>            
}

但是我得到了一个编译错误:Cannot implicitly convert type MyData to System.Collections.IList

如果我创建一个List<MyDataRow>类型的列表,填充它并返回这个列表对象,那么它就可以工作了。因此,换句话说,这是可行的:

代码语言:javascript
复制
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成员变量:

代码语言:javascript
复制
private MyData _mydata;

并且声明了MyData

代码语言:javascript
复制
public class MyData : IList<MyDataRow>
{
   ....
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-09-19 21:42:30

为什么我可以从GetList()返回List<MyDataRow>,但不能返回IList<MyDataRow>

这是因为List<T>实现了IListIList<T>不能转换为IList,它们是两个独立的接口。所以我来回答你的问题:

有没有人知道一种不用重新填充列表就能返回IList<MyDataRow>的方法?

如果具体类型实现了IList ( List<T>确实实现了),那么您可以显式地转换它,例如

代码语言:javascript
复制
return (IList)this.mydata;

更新

根据您的更新,您将不得不更新MyData以实现IList,否则您别无选择,只能返回一个实现它的新集合。

或者,如果MyData确实是一个通用列表,那么我建议你从List<T>继承它,这样你就可以获得更多的灵活性和兼容性,例如

代码语言:javascript
复制
class MyData : List<MyDataRow>
{
}
票数 15
EN

Stack Overflow用户

发布于 2012-09-19 21:45:48

MyData类需要实现IList以及通用版本的IList<T>

代码语言:javascript
复制
class MyData : IList<MyDataRow>, IList
{
}
票数 4
EN

Stack Overflow用户

发布于 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值。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12495910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档