通配符“使用”绑定在序列表达式中起作用,但在其他情况下不起作用

Dan*_*iel 5 f#

use在序列表达式中使用通配符模式,但不能在其他情况下使用。是否有一个原因?

let mkDisposable() = 
  { new IDisposable with 
      member __.Dispose() = () }

let mkSeq() =  
  seq {
    use _ = mkDisposable() //OK
    ()
  }

let f() =  
  use _ = mkDisposable() //ERROR: 'use' bindings must be of the form 'use <var> = <expr>'
  ()
Run Code Online (Sandbox Code Playgroud)

kvb*_*kvb 3

我相信这是计算表达式(在本例中为序列表达式,但此行为适用于所有计算表达式)脱糖的自然(但意外)结果。 正如规格所示

use pat = expr
cexpr
Run Code Online (Sandbox Code Playgroud)

被翻译成

Using(expr, fun pat -> cepxr)
Run Code Online (Sandbox Code Playgroud)

因为这是浅层语法翻译,所以您可以使用编写函数时可以使用的任何模式,包括_. 但是,对于普通use绑定,绑定的左侧必须是标识符,而不是模式(请参阅规范的第 6.6.3 节)。