Function F#:使用FluntNHibernate时查找不确定类型的对象

Function F#:使用FluntNHibernate时查找不确定类型的对象,function,fluent-nhibernate,f#,Function,Fluent Nhibernate,F#,我试图通过FluentNHibernate在F#项目中配置NHibernate static member GetNHibernateConfig = Fluently.Configure() .Database(MsSqlConfiguration.MsSql2008 .ConnectionString(fun c -> c.FromConnectionStringWithKey("connectionString")

我试图通过FluentNHibernate在F#项目中配置NHibernate

 static member GetNHibernateConfig = 
    Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008
                .ConnectionString(fun c -> c.FromConnectionStringWithKey("connectionString") |> ignore)
                    .ShowSql())
Visual Studio突出显示“c.FromConnectionStringWithKey”,但出现错误:


基于此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能会解决查找问题。

我对此一无所知,但通过在web上搜索API文档,我会尝试 改变

fun c ->

因为这个

我认为这可能是
c
的类型

编辑:

(显然类型是
MSSQLSconnectionStringBuilder

总之,更一般地说,如果你遇到F#不推断lambda类型而C#推断,那么可能

  • 您正在使用具有多个重载的方法
  • 一些重载子集使用
    Action
    Func
最简单的方法是显式添加
Action
Func
委托类型,以便F#正确地解决重载问题。在这种情况下,我认为

.ConnectionString(fun c -> ...)

.ConnectionString(操作(趣味c->…)

修复了它,这通常是解除阻止的最方便的方法。

我对此一无所知,但通过在web上搜索API文档,我会尝试 改变

fun c ->

因为这个

我认为这可能是
c
的类型

编辑:

(显然类型是
MSSQLSconnectionStringBuilder

总之,更一般地说,如果你遇到F#不推断lambda类型而C#推断,那么可能

  • 您正在使用具有多个重载的方法
  • 一些重载子集使用
    Action
    Func
最简单的方法是显式添加
Action
Func
委托类型,以便F#正确地解决重载问题。在这种情况下,我认为

.ConnectionString(fun c -> ...)

.ConnectionString(操作(趣味c->…)

修复了它,这通常是解除阻塞的最方便的方法。

不确定原因,但声明函数参数的类型有效:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(fun (c: MsSqlConnectionStringBuilder) -> c.FromConnectionStringWithKey("connectionString") |> ignore)
                .ShowSql())

无论如何,最好在F#中使用而不是FluentNHibernate。

不确定原因,但声明函数参数的类型有效:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008
            .ConnectionString(fun (c: MsSqlConnectionStringBuilder) -> c.FromConnectionStringWithKey("connectionString") |> ignore)
                .ShowSql())

无论如何,你最好在F#中使用而不是FluentNHibernate。

至于为什么,
可能有多个重载。ConnectionString
,C和F类型推理的工作方式不同,我想C能理解,但F不能。@Brian:奇怪的是,一个重载执行
操作
,另一个重载执行字符串。不应该有混淆?更准确地说,
动作
F#类型推断不能以这种方式工作。如果有两个重载,一个执行
操作
,另一个执行字符串,并且您传递了一个lambda,则在键入lambda之前,F#不会解析为
操作
一个。是的。我希望您也可以通过显式添加
新操作来解决此问题(有趣的是c->
。至于为什么,
可能有多个重载。ConnectionString
,c和F类型推理的工作方式不同,我想c会明白,但F不会。@Brian:奇怪的是,一个重载执行
操作,另一个重载执行字符串。应该没有混淆?更准确地说,是
动作
F#类型推断不是这样工作的。如果有两个重载,一个是执行
Action
,另一个是字符串,并且您传递了一个lambda,则F#在检查lambda.C#之前不会解析为
动作
一个。我希望您也可以通过显式添加
新动作来解决这个问题(有趣的c->
。它与任何重载都不兼容,它说
ConnectionStringBuilder->unit
MsSqlConnectionStringBuilder->unit
不兼容,并且
ConnectionStringBuilder->unit
string
不兼容,然后键入
MsSql
前缀。然后我希望它能工作。此外,我希望包装
新操作(…)
围绕
fun c->
lambda将起作用。它仅在明确说明动作类型参数时起作用,例如
动作
它与任何重载都不兼容,它表示
ConnectionStringBuilder->unit
MsSqlConnectionStringBuilder->unit
不兼容,并且
ConnectionStringBuilder->单元
字符串
不兼容,然后键入它并添加
MsSql
前缀。然后我希望它会工作。此外,我希望围绕
fun c->
lambda包装
新操作(…)
会工作。它仅在显式声明操作类型参数时有效,例如
操作