为什么我不能在扩展List的类中调用OrderBy?

Mat*_*hew 2 .net c# linq inheritance extension-methods

我有一个类,Deck它包含一个名为的方法Shuffle.

我正在进行重构Deck扩展List<Card>,而不是List<Card> Cards作为一个属性.但是,虽然Cards.OrderBy (a => Guid.NewGuid ())工作,OrderBy (a => Guid.NewGuid ())但不是:

Error CS0103: The name 'OrderBy' does not exist in the current context (CS0103)

为什么这不起作用?

jas*_*son 8

添加this到前面OrderBy,如

this.OrderBy(a => Guid.NewGuid()); // a random ordering
Run Code Online (Sandbox Code Playgroud)

OrderBy是一个扩展方法,IEnumerable<T>而不是一个公共方法List<T>.如果OrderBy在没有上下文的情况下键入,编译器将查找名为的实例或静态方法OrderBy.只有前缀为编译器找到OrderByIEnumerable<T>will 实例的前缀OrderBy.作为Deck : List<Card>List<Card> : IEnumerable<Card>,使用关键字this(对当前实例的引用)将为编译器提供定位方法所需的上下文Enumerable.OrderBy.

在公共API中继承List<T>被认为是不好的做法.首先,List<T>它不是为继承而设计的,可能应该是sealed; 现在为时已晚.通常,在使用框架类时,应该优先考虑组合而不是继承.

  • 更正:在公共API*中继承`List <T>`*被认为是不好的做法.如果继承类不是公共API的一部分,那么这不是问题. (2认同)
  • +1感谢您发布最后一段!所以人们常常掩饰这一点.我推荐Collection <T>或ObservableCollection <T>. (2认同)