相关疑难解决方法(0)

为什么F#中没有受保护的访问修饰符?

有没有更好的方法在F#中建模数据以避免需要它?

f#

39
推荐指数
2
解决办法
3910
查看次数

在F#3.0中打破活动模式

这个活动模式使用F#2.0编译:

let (|Value|_|) value = // 'a -> 'T option
  match box value with
  | :? 'T as x -> Some x
  | _ -> None
Run Code Online (Sandbox Code Playgroud)

但是,在F#3.0中,发出错误:

活动模式'|值| _ |' 具有包含不由输入确定的类型变量的结果类型.当没有提到结果案例时,常见原因是[sic],例如'let(| A | B |)(x:int)= A x'.这可以通过类型约束来修复,例如'let(| A | B |)(x:int):Choice = A x'

我试过了:

let (|Value|_|) value : 'T option = ...
Run Code Online (Sandbox Code Playgroud)

和:

let (|Value|_|) (value: 'U) = ...
Run Code Online (Sandbox Code Playgroud)

怎么修好?

环境:Visual Studio 2012(RTM)和FSI v11.0.50727.1

编辑:这是一个更简单的repro:

let (|X|) x = unbox x
Run Code Online (Sandbox Code Playgroud)

f# active-pattern f#-3.0 visual-studio-2012

8
推荐指数
1
解决办法
527
查看次数

无法在F#中使用受保护的事件

假设我们有以下C#类

public class Class1
{
    protected event EventHandler ProtectedEvent;
    protected virtual void OverrideMe() { }
}
Run Code Online (Sandbox Code Playgroud)

似乎不可能在F#中使用ProtectedEvent.

type HelpMe() as this =
    inherit Class1()

    do
        printfn "%A" this.ProtectedEvent        

    member x.HookEvents() =
        printfn "%A" x.ProtectedEvent

    member private x.HookEvents2() =
        printfn "%A" x.ProtectedEvent 

    override x.OverrideMe() =
        printfn "%A" x.ProtectedEvent 
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我试图调用printfn它,因为有多种方法可以在F#中连接事件,我希望很清楚,这只是导致问题的事件的引用.

在上面的每种情况下,编译器都会抱怨以下错误

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

我理解这个错误,是什么导致它及其目的.通常,解决方法是将调用包装在私有成员中,该方法适用于方法 - 但这似乎不适用于事件.无论我尝试什么,似乎都不可能在F#中使用受保护的事件,除非我求助于使用反射做某事,或者对基类做一些更改(在我的情况下是不可能的).

请注意,我也尝试了所有可能的使用组合base,thisx.

难道我做错了什么 ?

f#

5
推荐指数
1
解决办法
192
查看次数

标签 统计

f# ×3

active-pattern ×1

f#-3.0 ×1

visual-studio-2012 ×1