根据spec,use
绑定需要标识符(与let
不同)而不是模式。为什么是这样?这是一个不起作用的场景示例。
type Disposable = Resource of IDisposable
let f disposable =
use (Resource d) = disposable //ERROR: 'use' bindings must be of the form 'use <var> = <expr>'
()
答案 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()