为什么IList <>.Reverse()不像List <>()那样工作.反向

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>.我怎么能这样做?

bdu*_*kes 9

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)