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

Bru*_*ill 19 .net c# generics list c#-2.0

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

IList GetList()
Run Code Online (Sandbox Code Playgroud)

我正在使用.NET框架2,我想要返回一个实现IList的对象,如下所示:

public System.Collections.IList GetList()
{
    return this._mydata; // Implements IList<MyDataRow>            
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个编译错误说: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;
}
Run Code Online (Sandbox Code Playgroud)

但是,为了从类型IList<T>到它来重新创建列表似乎效率非常低IList.为什么我可以退货List<MyDataRow>' from 'GetList(),但不是IList<MyDataRow>?有没有人知道如何在IList<MyDataRow>没有重新填充新清单的情况下退货?

更新:

_mydata成员变量声明:

private MyData _mydata;
Run Code Online (Sandbox Code Playgroud)

MyData宣布:

public class MyData : IList<MyDataRow>
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*mes 15

为什么我可以返回一个List<MyDataRow>GetList(),但不是IList<MyDataRow>

这是因为List<T>implements IList,IList<T>不能被强制转换IList为2个独立的接口.所以回答你的问题:

有没有人知道如何在IList<MyDataRow>没有重新填充新清单的情况下退货?

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

return (IList)this.mydata;
Run Code Online (Sandbox Code Playgroud)

更新

根据您的更新,你将不得不更新MyData来实现IList,否则你别无选择,但要返回的新集合实现它.

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

class MyData : List<MyDataRow>
{
}
Run Code Online (Sandbox Code Playgroud)