And*_*hin 11 c# methods interface list ambiguity
我有问题List<T>.Reverse()和Reverse(this IEnumerable<TSource> source).看看代码:
// Part 1
List<int> list = new List<int> { 1, 2, 3 };
foreach (int x in list)
Console.Write(x);
Console.WriteLine();
list.Reverse();
foreach (int x in list)
Console.Write(x);
Console.WriteLine();
list.Reverse();
// Part2
IList<int> ilist = list;
foreach (int x in list)
Console.Write(x);
Console.WriteLine();
ilist.Reverse();
foreach (int x in ilist)
Console.Write(x);
Console.WriteLine();
ilist.Reverse();
Run Code Online (Sandbox Code Playgroud)
我的结果:
123
321
123
123
Run Code Online (Sandbox Code Playgroud)
因为-Part1 Reverse()是List<T>.Reverse(),Reverse()-Part2是Reverse(this IEnumerable<TSource> source)
我要List<int>.Reverse()在Part2中执行的IList<int>.我怎么能这样做?
IList<int>没有Reverse方法,所以它使用扩展方法.List<T>.Reverse在您的IList<int>参考上使用的唯一方法是将其转换或转换为List<int>.只有当你确定它真的是List<int>第一个时,才会有效:
IList<int> abstractList;
var concreteList = (List<int>)abstractList;
concreteList.Reverse();
Run Code Online (Sandbox Code Playgroud)
另一种选择是从您的实例创建一个,而不是假设它已经是:List<int>IList<int>List<int>
IList<int> abstractList;
var concreteList = new List<int>(abstractList);
concreteList.Reverse();
Run Code Online (Sandbox Code Playgroud)
的原因,该Reverse扩展方法实际上并不影响基础列表,因为它的运作上IEnumerable<T>,这不一定是可写的(没有的Enumerable扩展方法进行更改原来的集合,他们返回一个新的集合).
要使用此版本Reverse,只需使用Reverse调用的产品,而不是原始列表:
IList<int> abstractList;
IEnumerable<int> reversedList = abstractList.Reverse();
Run Code Online (Sandbox Code Playgroud)