为什么“使用”绑定中不允许使用模式?

时间:2011-12-09 18:26:20

标签: f#

根据specuse绑定需要标识符(与let不同)而不是模式。为什么是这样?这是一个不起作用的场景示例。

type Disposable = Resource of IDisposable

let f disposable =
  use (Resource d) = disposable //ERROR: 'use' bindings must be of the form 'use <var> = <expr>'
  ()

1 个答案:

答案 0 :(得分:1)

我认为可能的答案是许多模式没有意义。例如,您希望编译器如何处理以下代码?

type DisposablePair = DisposablePair of IDisposable * IDisposable

let f disposablePair =
    use (DisposablePair(x,y)) = disposablePair
    ()

您的奇怪错误消息可能是因为即使您使用let绑定,您也需要绑定(Resource d)而不是Resource(d)(编译器认为您“宣布一项新职能。”

对于它的价值,我确实发现无法使用下划线模式有时令人烦恼(特别是在处理仅存在划分范围的IDisposable个实例时,例如System.Transactions.TransactionScope)。概括use绑定以处理下划线和一些其他情况的一种方法是要求use绑定的右侧为IDisposable但允许左侧的任何模式手边,这样:

use p = v in e 

将语法转换为类似

的内容
let ((p:System.IDisposable) as d) = v in try e finally d.Dispose()