gpt4 book ai didi

.net - 带有 byref 参数的委托(delegate)被 .NET 事件拒绝

转载 作者:行者123 更新时间:2023-12-02 05:14:36 24 4
gpt4 key购买 nike

这简直要了我的命。

我已经阅读了有关该主题的帖子:here是最相关的,但它没有涵盖将委托(delegate)传递给事件(尽管我预计这会很简单)。

具体来说,VS中的错误是:

This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 2 arguments.

我能找到的错误的最佳推理是Eric Lippert's blog中的旁白。 ,但我想我已经在下面处理了它。

// Documentation: http://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx    
// Don't forget to unwrap the instance before using it.
let mutable ieInstance : option<InternetExplorer> = None

let onDocumentComplete (pDisp : Object) (url : byref<Object>) =
let doc = ieInstance.Value.Document :?> IHTMLDocument2
let window = doc.parentWindow
window.execScript(@"alert('Message added by addon.');") |> ignore

// All of the following underline "DocumentComplete" as the source of the error.
do ieInstance.Value.DocumentComplete.AddHandler(new Handler<byref<Object>>(fun pDisp url -> onDocumentComplete pDisp &url))
do ieInstance.Value.DocumentComplete.AddHandler(fun pDisp url -> onDocumentComplete pDisp &url)
do ieInstance.Value.DocumentComplete.Add(fun pDisp url -> onDocumentComplete pDisp &url)
do ieInstance.Value.DocumentComplete.Add(fun _ _ -> ())
do ieInstance.Value.DocumentComplete.Add(fun (_, _) -> ())

感谢任何建议!

更新 1我引用的库是“Microsoft Internet Controls”中的 Interop.SHDocVw。我还尝试使用 SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler 作为委托(delegate)类型,但仍然失败。

最佳答案

我得到的错误与你略有不同:

error FS1091: The event 'DocumentComplete' has a non-standard type. If this event is declared in another CLI language, you may need to access this event using the explicit add_DocumentComplete and remove_DocumentComplete methods for the event. If this event is declared in F#, make the type of the event an instantiation of either 'IDelegateEvent<_>' or 'IEvent<_,_>'.

如果你遵循这个建议,你就会得到这个,它为我编译:

ieInstance.Value.add_DocumentComplete(fun pDisp url -> onDocumentComplete pDisp &url)

编辑

Keith 和 Tahir 的评论让我意识到 - 这种情况确实很难诊断,事实上在 2 月份 F# 3.1.1 发布后不久就得到了修复。

新行为是更好的错误消息(如上所示)和更好的智能感知条目(现在显示所需的 add_remove_ 成员,以及无用的 DocumentComplete 条目实际上现在已隐藏)。因此,如果您使用的是已发布的 F# 位,抱歉。如果您使用的是最新的预发布 F# 位,那就不会那么痛苦。

该更改是在 Codeplex 上所有内容开源之前进行的,但仍然可以在 later merge to Github 中看到它的一些记录。 (请参阅对 infos.fs 的更改以及对 nameres.fs 的最后更改)。

关于.net - 带有 byref 参数的委托(delegate)被 .NET 事件拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25063942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com