编译C#客户端时,无法编译在其他模块中定义的F#类型扩展

时间:2018-01-08 14:18:03

标签: f#

我无法编译在编译C#客户端时在其他模块中定义的F#类型扩展。

Events.fs

我有以下类型:

type RegistrationSubmissionEvent =
    | RegistrationSucceeded of Profile
    | RegistrationFailed    of ValidatedForm

EventExtraction.fs

我在一个单独的模块中为RegistrationSubmissionEvent实现了一个类型扩展:

type RegistrationSubmissionEvent with
    member x.TryGetProfile() = 
           match x with
           | RegistrationSucceeded profile -> Some profile
           | _                             -> None

C#客户端:

var viewmodel =  new ProfileEditorViewmodel(args.TryGetProfile().Value, SaveProfile());

问题:

问题是,即使我在C#代码中导入EventExtraction模块,它仍然无法将TryGetProfile识别为该类型的函数。

注意,如果我在与被区分的联合类型相同的模块中具有类型扩展名,则此代码有效。

1 个答案:

答案 0 :(得分:3)

如果希望扩展方法在C#中可见,则应使用C#样式扩展方法的语法。

open System.Runtime.CompilerServices

[<Extension>]
type RegistrationSubmissionEventExtension () =
    [<Extension>]
    static member TryGetProfile (x : RegistrationSubmissionEvent) = 
         match x with
         | RegistrationSucceeded profile -> Some profile
         | _                             -> None

要解释为什么当你将扩展放在同一个模块中时,你应该看看this page上的内部和可选扩展之间的区别,但简而言之,如果它们在同一个模块中扩展方法实际上会被添加到类型本身中(因此也可以通过反射获得)。