我有一个返回List<IPAddress>
我在我的课堂上写了另一个方法,它是一个包装器。但我被告知不要返回List<>
,而是IList
或ICollection
。
现在我有什么:
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)
答案 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()
方法返回的任何返回类型。您仍然可以访问该返回类型的所有属性。