2011-12-09 10 views
1

specによれば、useバインディングは、パターンの代わりに識別子(とは異なります)を必要とします。どうしてこれなの?ここでは動作しないシナリオの例を示します。"use"バインディングでパターンが許可されないのはなぜですか?

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)をバインドする必要があるだろうという事実のために、おそらくです。

私はアンダースコアパターンを使用することができないことがあります(具体的には、System.Transactions.TransactionScopeのように範囲を限定するために存在するIDisposableのインスタンスを処理する場合)。

use p = v in e 
:アンダースコアを処理するために useバインディングを一般化するとなるように、いくつかの他の状況は、 IDisposableするが、左手側に任意のパターンを許可するように結合 useの右側を必要とするだろう一つの方法

は文法的に次のようなものに変換されます

let ((p:System.IDisposable) as d) = v in try e finally d.Dispose() 
+0

おっと、申し訳ありません。問題の謎はまだ残っています。私はあなたの提案されたソリューションが好きです。率直に言って、私はたぶん「使用」なしで幸せになるだろう。私は 'using'の構文と動作を好みます。 – Daniel

+0

最初の質問に対する1つの答えは、パターン内のすべての識別子がIDisposablesにバインドする必要があることです。しかし、私はあなたの解決策を好む(私はワイルドカードを許す以外の用途について考えることはできないが)。 – Daniel

関連する問題