在新的控制檯應用程序中,只粘貼以下代碼會導致異常「參數不是可識別的方法名稱」。F中的引用和模式匹配#
- 以下代碼是否適用於您的安裝?
- 小丑:你知道爲什麼它不起作用嗎?
// Learn more about F# at http://fsharp.net
// See the 'F# Tutorial' project for more help.
let somefunction1 arg =()
let somefunction2() =()
open Quotations.DerivedPatterns
let test() =
let d = <@ somefunction1() @>
let e = <@ somefunction2() @>
match d with
| SpecificCall <@ somefunction1() @> (a,b ,c) -> printfn "somefunction"
| _ -> printfn "something else"
match d with
| SpecificCall <@ somefunction1 @> (a,b ,c) -> printfn "somefunction"
| _ -> printfn "something else"
match e with
| SpecificCall <@ somefunction2() @> (a,b ,c) -> printfn "somefunction"
| _ -> printfn "something else"
//THIS FAILS HERE saying "The parameter is not a recognized method name"
match e with
| SpecificCall <@ somefunction2 @> (a,b ,c) -> printfn "somefunction"
| _ -> printfn "something else"
[<EntryPoint>]
let main argv =
test()
printfn "%A" argv
0 // return an integer exit code
望着主動模式的定義SpecificCall在編譯器中定義,我覺得:
[<CompiledName("SpecificCallPattern")>]
let (|SpecificCall|_|) templateParameter =
// Note: precomputation
match templateParameter with
| (Lambdas(_,Call(_,minfo1,_)) | Call(_,minfo1,_)) ->
let isg1 = minfo1.IsGenericMethod
let gmd = if isg1 then minfo1.GetGenericMethodDefinition() else null
// end-of-precomputation
(fun tm ->
match tm with
| Call(obj,minfo2,args)
#if FX_NO_REFLECTION_METADATA_TOKENS
when (minfo1.MethodHandle = minfo2.MethodHandle &&
#else
when (minfo1.MetadataToken = minfo2.MetadataToken &&
#endif
if isg1 then
minfo2.IsGenericMethod && gmd = minfo2.GetGenericMethodDefinition()
else
minfo1 = minfo2) ->
Some(obj,(minfo2.GetGenericArguments() |> Array.toList),args)
| _ -> None)
| _ ->
invalidArg "templateParameter" (SR.GetString(SR.QunrecognizedMethodCall))
當我在Visual Studio 2012中粘貼來自** Edit#2 **的代碼時,它對我來說工作正常。你可以在某處分享編譯好的程序集,也許有一些區別......另外,你使用的是什麼版本的F#(等等)? –
這很奇怪。我們如何追蹤所有這些信息?融合日誌? – nicolas
不確定,但是如果你從你的機器上共享編譯好的'exe',我可以試着運行它來查看我們正在使用的編譯器還是在裝載的'FSharp.Core.dll'中是否有區別。 –