Я думаю, что вероятный ответ заключается в том, что многие шаблоны не имеют смысла.Например, как вы ожидаете, что компилятор будет обрабатывать следующий код?
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()