【问题标题】:Unable to call protected base method无法调用受保护的基本方法
【发布时间】:2019-12-06 07:57:44
【问题描述】:

我正在尝试在 F# 中实现以下类(来自 https://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/):

public class RangeObservableCollection<T> : ObservableCollection<T>
{
  private bool _suppressNotification = false;

  protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
  {
    if (!_suppressNotification)
      base.OnCollectionChanged(e);
  }

  public void AddRange(IEnumerable<T> list)
  {
    if (list == null)
      throw new ArgumentNullException("list");

    _suppressNotification = true;

    foreach (T item in list)
    {
      Add(item);
    }
    _suppressNotification = false;
    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
  }
}

这是简单的代码,移植也很直接:

type RangeObservableCollection<'T>() =
    inherit ObservableCollection<'T>()

    let mutable suppressNotification = false

    override __.OnCollectionChanged(e: NotifyCollectionChangedEventArgs) =
        if not suppressNotification
        then base.OnCollectionChanged e

    member __.AddRange(items: 'T seq) =
        if isNull items
        then ArgumentNullException "items" |> raise

        suppressNotification <- true

        items |> Seq.iter __.Add

        suppressNotification <- false

        NotifyCollectionChangedAction.Reset
        |> NotifyCollectionChangedEventArgs
        |> __.OnCollectionChanged

但是,我在最后一行收到编译器错误,说

调用了受保护的成员或正在使用“base”。这仅在成员的直接实现中允许,因为它们可以逃脱其对象范围。

我能找到的对该错误的唯一其他参考是this question;但是,那里的解决方案似乎不适用于这里,因为我不处理事件。

所以,我的问题分为两部分:

  • 就语言/编译器而言,这里的实际问题是什么?
  • 有没有办法解决这个问题,还是无法在 F# 中实现?

【问题讨论】:

    标签: inheritance f# protected


    【解决方案1】:

    如果将最后三行更改为立即调用 OnCollectionChanged,则可以:

    __.OnCollectionChanged(NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset))
    

    我认为问题在于 __.OnCollectionChanged 本身(即如果不立即调用)会产生对函数的引用,该函数可能会从类的上下文中逃脱。 (不是在这个例子中可以,而是通过 F# 用来确定这一点的简单规则,编译器不能排除它。

    【讨论】:

      猜你喜欢
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 2020-03-31
      • 2018-10-12
      • 2022-09-23
      • 2011-10-26
      • 2016-02-19
      相关资源
      最近更新 更多