在F#中,如何生成Func类型的表达式<;obj>;?

在F#中,如何生成Func类型的表达式<;obj>;?,f#,c#-to-f#,F#,C# To F#,我使用的api需要Func类型的值。(具体地说,我正在打电话 如何在F#?中构造该值,让F=new System.Func(fun()->printfn“ok”;new obj()) 您通常可以传入任何()->obj,它将自动转换为Func。您可能需要使用Func包装您的fun: >让d:Func=Func(fun()->框“hello”);; val d:Func 当调用接受函数的任何委托的方法时,您不需要显式创建委托,因为F#会隐式地将lambda表达式转换为委托类型(在成员调用中)。我认为

我使用的api需要Func类型的值。(具体地说,我正在打电话

如何在F#?

中构造该值,让F=new System.Func(fun()->printfn“ok”;new obj())
您通常可以传入任何
()->obj
,它将自动转换为
Func
。您可能需要使用
Func
包装您的
fun

>让d:Func=Func(fun()->框“hello”);;
val d:Func

当调用接受
函数的任何委托的方法时,您不需要显式创建委托,因为F#会隐式地将lambda表达式转换为委托类型(在成员调用中)。我认为仅使用lambda函数调用该方法应该有效(如果没有,您能否共享错误消息?)

下面是一个简单的示例,演示了这一点:

type Foo() = 
  member x.Bar(a:System.Func<obj>) = a.Invoke()

let f = Foo()
let rnd = f.Bar(fun () -> new Random() :> obj)
type Foo()=
成员x.Bar(a:System.Func)=a.Invoke()
设f=Foo()
让rnd=f.Bar(fun()->new Random():>obj)
在你的情况下,我认为这样的方法应该有效:

m.GetMetadataForType((fun () -> <expression> :> obj), modelType)
m.GetMetadataForType((fun()->:>obj),modelType)

请注意,您需要显式向上转换(
expr:>obj
),以确保lambda函数返回正确的类型(
obj
)。如果您想使用
let
将lambda函数指定给一个局部值,那么它将不起作用,因为隐式转换只有在作为参数直接传递时才起作用。但是,在这种情况下,它会使代码变得更好。

我还可以省略'new'关键字。您节省了我的时间!我认为您的示例中有一个输入错误,since
Bar
接受一个
Func
但是你传递了一个隐式的
Func
。你是正确的。谢谢Tomas。在我的情况下,我甚至不需要强制转换。我最初的问题是我这样做了:让acc=(fun()->model)让meta=m.GetMetadataForType(acc,t)不转换,切换到:让meta=m.GetMetadataForType((fun()->model),t)工作得很好。有一件事让我大吃一惊。隐式转换只有在系统名称空间打开的情况下才有效。这可能看起来(而且可能是)很明显,但如果您不这样做,您得到的错误消息就没有多大帮助。
type Foo() = 
  member x.Bar(a:System.Func<obj>) = a.Invoke()

let f = Foo()
let rnd = f.Bar(fun () -> new Random() :> obj)
m.GetMetadataForType((fun () -> <expression> :> obj), modelType)