2011-12-09 44 views
1

根据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>' 
() 
+0

奇怪,我想你最好试着解释你在做什么。这段代码没有足够的意义。 – vcsjones

+0

@vcsjones:正如kvb指出的,代码是不正确的。奇怪的错误信息是一个红色的鲱鱼。不过,我的中心点仍然相关。 – Daniel

回答

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() 
+0

哎呀,对不起,我在那里的sl iness。问题的回答仍然存在。我喜欢你提出的解决方案。坦率地说,如果没有'使用',我可能会很开心。我更喜欢'using'的语法和行为。 – Daniel

+0

对您最初的问题的一个答案是模式中的所有标识符都必须绑定到IDisposables。不过,我更喜欢你的解决方案(尽管我不能想到超出允许通配符的用处)。 – Daniel

相关问题