我无法编译在编译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识别为该类型的函数。
注意,如果我在与被区分的联合类型相同的模块中具有类型扩展名,则此代码有效。
答案 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上的内部和可选扩展之间的区别,但简而言之,如果它们在同一个模块中扩展方法实际上会被添加到类型本身中(因此也可以通过反射获得)。