Почему шаблоны не разрешены в привязках «использования»? - PullRequest
1 голос
/ 09 декабря 2011

Согласно 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>'
  ()

1 Ответ

1 голос
/ 09 декабря 2011

Я думаю, что вероятный ответ заключается в том, что многие шаблоны не имеют смысла.Например, как вы ожидаете, что компилятор будет обрабатывать следующий код?

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...