我不确定是否允许使用非静态公共成员活动模式,但您可以在没有编译器抱怨的情况下定义它们。如果允许它们与一个匹配的语法是什么?编译器在FooBar2.doSomething中为Foo提供了类型不匹配。期待'a -> Choice<'b,'c>
给定'a -> 'd -> Choice<unit,unit>
// No error in this class, static works great
type FooBar() =
static member (|Foo|Bar|) (x, y) =
match x = y with
| true -> Foo
| false -> Bar
member x.doSomething y =
match x, y with
| Foo -> ()
| Bar -> ()
type FooBar2() =
member x.(|Foo|Bar|) y =
match x = y with
| true -> Foo
| false -> Bar
// compiler error on "Foo"
member x.doSomething y =
match y with
| Foo -> ()
| Bar -> ()
答案 0 :(得分:6)
不应将活动模式用作成员。事实上,这些编译完全是我们将修复的编译器错误(感谢报告:))。使用本地或模块绑定的“let”来定义活动模式。
答案 1 :(得分:3)
我并不感到惊讶,这不起作用,我无法看到自然的语义解释,例如活动模式。当您看到Foo
模式时,您如何知道要使用哪个实例?您是否可以为Foo
和Bar
案例设置不同的实例(因此不完整的模式匹配)?这里的问题似乎没有优雅的解决方案。说实话,我很惊讶甚至静态情况都有效,我在规范中没有看到任何形式的活动模式的定义。
答案 2 :(得分:0)
自1.9.9.9版以来,成员识别器似乎已经出局。即使是静态成员。我认为这是一种耻辱,因为它允许识别器重载。我可以为Type,MemberInfo等设置一个'Name'识别器。现在我需要一个'Type_Name'。 'Member_Name'等以避免命名冲突。只是'姓名'更好。