4

在新的控制台应用程序中,仅粘贴以下代码会导致异常“参数不是可识别的方法名称”。

  • 以下代码是否适用于您的安装?
  • 小丑:你知道为什么它对我不起作用吗?

// 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))
4

1 回答 1

2

副手,这对我来说看起来不错......你是否有可能掩盖了var某种方式的原始定义?例如,以下独立示例对我来说很好:

let var<'a>() = Unchecked.defaultof<'a>

match <@ var<int>() @> with
| Quotations.DerivedPatterns.SpecificCall <@ var @> (obj,_,[]) ->
    printfn "var"
| _ -> printfn "something else"
于 2012-10-15T16:24:50.427 回答