2017-01-10 3 views
4

私は既存しているコード:新しいパターンマッチ構文は既存の変数と連動できますか?

internal bool firstAsSymbol(out Symbol s) 
    { 
     return (s = first as Symbol) != null; 
    } 

私は新しいis構文を使用することができますが、私は、ローカル変数を導入する必要があります。

internal bool firstAsSymbol(out Symbol s) 
    { 
     var result = first is Symbol sym; 
     s = sym; 
     return result; 
    } 

EDITを:実際には、上記のコードはコンパイルされません! symは、s = sym;行では不定になることがあります。したがって、さらに悪いことです:ifステートメントを使用して、then節とelse節の両方にsを割り当てる必要があります。 (symを正しい句で触れることができるようにしようとしています)。

(もちろん、元のコード以外の)簡単な代替方法はありますか?

+5

なぜあなたは最初の方法でメソッドを持っていますか?どのように役立つのですか? – musefan

+0

コードはもともと呼び出し元サイトでのキャストを避けるために作成されたので、キャストされた値を返す必要があります。 –

+2

これは、呼び出しコードの複雑さを減らすための良いリファクタリングパターンです。これはメソッドとして間違っていません。 –

答えて

1

私は質問へのコメントで実現したように、呼び出し元のサイトらしい:

exprs.first is Symbol s 

EDIT:私は質問の中で述べた問題を除き

exprs.firstAsSymbol(out var s) 

に変更することができます編集:パターンマッチが失敗した場合、s == nullとすることはできません。あなたが発見したように後知恵で

、ルーチンは

+0

私はこれは、この特定のケースの唯一の解決策です。私はまだ値がパターンマッチの結果によって定義された 'out'パラメータの解決策を望んでいますが、私はそれがMicrosoftのプロセスでは遅すぎると推測していますそのシナリオに対応する。 –

2

:-) firstIsSymbolと呼ばれている必要があり、is T表現を介して導入された変数は、発現行の後にスコープで終わるが、彼らが割り当てられていないこととして使用できません。

この理由は、新しいout var機能が原因です。その機能を望みどおりに機能させるために、言語チームはout var変数を周囲のスコープに漏洩させました。彼らは、割り当てられていない可能性があるため、その外側のスコープでは使用できないとしても、同じ方法で変数をリークさせることを決定しました。

私はこの申し訳ありません最近の状態についての記事を書いた:C# 7, “out var” and changing variable scope

一つの方法は、タプルを使用することで、あなたがC#7の機能を利用するためのコードを書き換えることができる方法について:

internal (bool, Symbol) FirstAsSymbol() => 
    first is Symbol sym ? (true, sym) : (false, null); 

をしかし、実際に、それはFirstAsSymbolへを呼び出すコードを見て価値があるだろうのうち、が新しい機能をうまく利用できるかどうかを確認してください。

関連する問題