使用ICollection而不是List

时间:2014-04-09 14:32:52

标签: c# ilist icollection

我有一个返回List<IPAddress>

的外部方法

我在我的课堂上写了另一个方法,它是一个包装器。但我被告知不要返回List<>,而是IListICollection。 现在我有什么:

MyClass obj = new MyClass();
List<IPAddress> addr = obj.GetAddr();//GetAddr() now return `List`,but should be changed to return ILIst or ICollection

我该怎么办 - 施法?

UPD 我做了你说的,并得到一个错误“不能隐含地将Ilst转换为List (这是.net 4.5)

4 个答案:

答案 0 :(得分:2)

他/她可能的意思是:将列表作为返回IList<T>ICollection<T>

为此,只需更改方法的签名并按照惯例返回列表:

public ICollection<T> Method(){
    MyClass obj = new MyClass();
    List<IPAddress> addr = obj.GetAddr();

    return addr;
}

这是为了避免将客户端绑定到具体的List<T>实现。

通过返回更抽象的内容,例如ICollection<T>,甚至是IEnumerable<T>,如果您以后决定使用HashSet<T>而不是List<T>,则不会遇到任何问题内部{{1}}。签名和客户的代码将保持不变。

答案 1 :(得分:1)

您可以将方法返回类型更改为IList<IPAddress>IEnumerable<IPAddress>,如:

public IList<IPAddress> GetAddress()
{
    return new List<IPAddress>(); //replace with your code to return list
}

public IEnumerable<IPAddress> GetAddress()
{
    return new List<IPAddress>(); //replace with your code to return list
}

答案 2 :(得分:0)

只需更改方法的返回值即可。由于List可以隐式转换为两个接口,因此不需要任何转换。

答案 3 :(得分:0)

如果obj.GetAddr()返回IList<IPAddress>ICollection<IPAddress>IEnumerable<IPAddress>,您需要做的就是在作业结束时添加.ToList()

List<IPAddress> addr = obj.GetAddr().ToList();

或者,您可以遵循当前不明确键入变量的惯例,并执行以下操作:

var addr = obj.GetAddr();

这将允许您将addr变量维护为GetAddr()方法返回的任何返回类型。您仍然可以访问该返回类型的所有属性。

相关问题