Ответ от kvb дает всю теорию, поэтому я подумал, что мог бы также добавить пример кода.Я не знаю источника фрагмента, поэтому я сделаю некоторые предположения на основе названий - надеюсь, он будет полезен, даже если он может не совпадать с исходным образцом.
Как говорит kvbкод move canvas update
на самом деле является вызовом функции, который возвращает функцию, которая затем добавляется в качестве обработчика к событию MouseMove
.
Это означает, что move
может бытьобъявляется следующим образом:
let move (canvas:Canvas) (update:unit -> unit) (me:MouseEventArgs) =
// This function gets called when the mouse moves
// - values me.X and me.Y give the current mouse location
// - we can access 'canvas' that was declared when registering handler
// - we can call 'update' to do some more work...
// Pseudo-example:
canvas.Children.[0].Width <- me.X
update()
При регистрации обработчика событий код move canvas update
указывает первые два аргумента функции move
, так что обработчик может получить доступ к значению canvas
, которое, возможно, было объявлено.в месте, где зарегистрирован обработчик (без использования изменяемых переменных!)
let canvas = new Canvas() // Create canvas
let update () = ... // some function that performs update
// Register handler and give it canvas and update as first two arguments
canvas.MouseMove.Add(move canvas update)
Это также должно объяснить, почему обработчику события не нужно принимать sender:object
в качестве первого аргумента - вы можете передатьcanvas
(который является отправителем) в качестве первого аргумента с использованием приложения с частичными функциями статически типизированным способом (поэтому вам не нужно приводить object
к Canvas
).