【发布时间】:2012-08-24 15:29:29
【问题描述】:
F# 3.0 对base 和protected 成员的调用添加了更严格的检查。我在 C# 中有类似以下抽象类的东西,它有 protected static 派生类使用的辅助方法。
public abstract class Processor {
public abstract void Process();
protected static void Helper(object arg) { }
}
在 F# 中,其中一个辅助方法作为一等函数传递:
type DerivedProcessor() =
inherit Processor()
let init f =
f ()
override x.Process() =
init Processor.Helper
它在 2.0 中编译没有问题,但在 3.0 中产生错误:
调用了受保护的成员或正在使用“base”。这仅在成员的直接实现中允许,因为它们可以逃脱其对象范围。
好的,很容易遵守,只需将调用包装在另一个静态成员中
static member private HelperWrapper(arg) = Processor.Helper(arg)
并通过它。但为什么呢?
C# 使用相同的模式没有问题。
public class HappyToCompile : Processor {
private void Init(Action<object> f) {
f(null);
}
public override void Process() {
Init(Helper);
}
}
问题:
- 为什么要添加更严格的检查?
- (及相关)这种微不足道的解决方法解决了什么可怕的问题?
- 是否有更好的设计值得鼓励?
【问题讨论】:
标签: inheritance f# compiler-errors protected f#-3.0