3

我在 WPF / FsXaml 应用程序中使用以下代码片段:

let groupSelected(e: SelectionChangedEventArgs) =
    e.AddedItems
    |> Seq.cast<string>
    |> Seq.head
    |> SelectedGroupChanged

let GroupSelected = groupSelected

当我将鼠标悬停时groupSelected,Visual Studio 显示以下内容:

val groupSelected: e:SelectionChangedEventArgs -> ClientGroupEvent

它略有不同GroupSelected

val GroupSelected: (SelectionChangedEventArgs -> ClientGroupEvent)

我以前在其他情况下就注意到了这种差异,但从未考虑过太多。如果我想调用其中任何一个,我的代码中的语法是相同的......groupSelected(e)并且GroupSelected(e)都编译得很好。

但是,当我尝试从 XAML 中使用这两个时,只有这样才有效:

{x:Static local:EventConverters.GroupSelected}

不起作用

{x:Static local:EventConverters.groupSelected}

这两者之间有什么区别,使得 XAML 静态扩展只适用于第二个?我会(错误地?)认为它们是同一回事。

4

1 回答 1

4

这是由于生活在 .NET 框架世界中而使简单的功能性想法变得更加复杂的领域之一。F# 确实以两种不同的方式编译你的groupSelectedGroupSelected

IntelliSense 确实会告诉您这一点。大多数时候,这不是您需要担心的事情,将以下两个视为同一事物是非常明智的(而且,就 F# 本身而言,它们是):

val groupSelected: e:SelectionChangedEventArgs -> ClientGroupEvent
val GroupSelected: (SelectionChangedEventArgs -> ClientGroupEvent)

主要区别在于两者的编译方式不同。第一个作为方法,第二个作为返回函数值的属性。使用 C# 表示法:

// groupSelected is compiled as a method:
ClientGroupEvent groupSelected(SelectionChangedEventArgs e);

// GroupSelected is compiled as a property:
FSharpFunc<SelectionChangedEventArgs, ClientGroupEvent> GroupSelected { get; }
于 2019-03-13T11:05:16.220 回答