相关疑难解决方法(0)

了解F#3.0中对受保护/基本成员使用的更改

F#3.0为呼叫baseprotected成员添加了更严格的检查.我有类似C#中的以下抽象类,它有protected static派生类使用的辅助方法.

public abstract class Processor {
    public abstract void Process();
    protected static void Helper(object arg) { }
}
Run Code Online (Sandbox Code Playgroud)

在F#中,其中一个辅助方法作为第一类函数传递:

type DerivedProcessor() =
  inherit Processor()

  let init f =
    f ()

  override x.Process() =
    init Processor.Helper
Run Code Online (Sandbox Code Playgroud)

它在2.0中没有投诉编译,但在3.0中产生错误:

被调用的受保护成员或正在使用"基础".这只能在成员的直接实现中使用,因为它们可以逃避它们的对象范围.

好的,它很容易遵守,只需将调用包装在另一个静态成员中

static member private HelperWrapper(arg) = Processor.Helper(arg)
Run Code Online (Sandbox Code Playgroud)

并通过那个intead.但为什么?

C#对于同样的模式没有问题.

public class HappyToCompile : Processor {
    private void Init(Action<object> f) {
        f(null);
    }

    public override void Process() {
        Init(Helper);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么要加入更严格的检查?
  2. (和相关的)这样一个琐碎的解决方案解决了什么可怕的问题?
  3. 是否有一个更好的设计,这应该鼓励?

inheritance f# compiler-errors protected f#-3.0

6
推荐指数
1
解决办法
375
查看次数

标签 统计

compiler-errors ×1

f# ×1

f#-3.0 ×1

inheritance ×1

protected ×1