F# 与具有通用 return 类型的 C# 函数互操作
F# Interop with C# function that has generic return type
当我在 C# 中有一个泛型函数时,其中泛型参数仅定义函数的 return 类型,F# 似乎无法推断出泛型参数。我也不知道如何打字注释。
例如下面的C#函数在dapper.net和ServiceStack-ORM-Lite等轻量级ORM中很常见:
public T Get<T>(string sql)
{
//....
var obj = Activator.CreateInstance<T>();
//....
return obj;
}
假设我尝试在 F# 中使用它...首先通过类型推断:
let GetCustomer sql : Customer =
MyCSharpObj.Get(sql)
或者,我尝试注释类型(甚至不确定这个语法是否正确):
let GetCustomer sql : Customer =
MyCSharpObj.Get<Customer>(sql)
在这两种情况下,我都收到编译错误(在 MyCSharpObj.Get
行):
Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.
如何在 F# 中使用这种方法?
来自我的评论:
let GetCustomer (sql : string) : Customer = ..
"sql" 无法识别其类型,而不是 return 值。
当我在 C# 中有一个泛型函数时,其中泛型参数仅定义函数的 return 类型,F# 似乎无法推断出泛型参数。我也不知道如何打字注释。
例如下面的C#函数在dapper.net和ServiceStack-ORM-Lite等轻量级ORM中很常见:
public T Get<T>(string sql)
{
//....
var obj = Activator.CreateInstance<T>();
//....
return obj;
}
假设我尝试在 F# 中使用它...首先通过类型推断:
let GetCustomer sql : Customer =
MyCSharpObj.Get(sql)
或者,我尝试注释类型(甚至不确定这个语法是否正确):
let GetCustomer sql : Customer =
MyCSharpObj.Get<Customer>(sql)
在这两种情况下,我都收到编译错误(在 MyCSharpObj.Get
行):
Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.
如何在 F# 中使用这种方法?
来自我的评论:
let GetCustomer (sql : string) : Customer = ..
"sql" 无法识别其类型,而不是 return 值。