我尝试将member constraint
与inline
函数一起使用,如下所示:
let inline extractMessageAsync
(envelope: ^env when ^env:
(member GetBodyAsync: unit-> Task<'a>)) =
envelope.GetBodyAsync()
但是出现以下错误:
根据此程序点之前的信息查找不确定类型的对象。在此程序指向之前可能需要类型注释,以约束对象的类型。这样可以解决查找问题。
尽管我知道编译器需要有关此类型的更多信息,但我不明白为什么,尤其是因为它可以与static member
或(+)
等运算符的(*)
约束一起很好地工作
答案 0 :(得分:2)
尝试一下:
let inline extractMessageAsync<'a, ^env
when ^env: (member GetBodyAsync: unit-> Task<'a>)>
(envelope: ^env) =
(^env: (member GetBodyAsync: unit-> Task<'a>) envelope)
答案 1 :(得分:2)
您可以编写一个更简短,更通用的版本,如下所示:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<i class="fa" style="font-size:24px"></i>
<span> 5 </span>
</body>
</html>
无论方法的返回类型如何,现在写let inline GetBodyAsync x = (^a: (member GetBodyAsync: unit -> ^b) x)
等效于写GetBodyAsync
。
用法:
fun x -> x.GetBodyAsync()