根据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>'
()
根据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>'
()
我认为可能的答案是很多模式没有意义。例如,你如何期望编译器处理下面的代码?
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()
奇怪,我想你最好试着解释你在做什么。这段代码没有足够的意义。 – vcsjones
@vcsjones:正如kvb指出的,代码是不正确的。奇怪的错误信息是一个红色的鲱鱼。不过,我的中心点仍然相关。 – Daniel