2016-07-25 2 views
1

"var"変数を宣言する必要があるコードがあります。この宣言は、すべての例外をキャッチするtryブロック内で行わなければなりません:範囲外のtry catchブロックを終了するので暗黙的に型付けされたローカル変数を初期化する必要があります:スコープ定義

try 
{ 
    var calc = (Type1)obj; 
    var results = calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    var results = calc.Function(); 
} 
finally 
{ 
    return results; 
} 

今の問題は、「結果が」動作しませんされています。型キャストをチェックし、それに応じて型を変更する必要があるので、私はvarをtry以外の方法で宣言することはできません。

タイプ1、タイプ2は異なるインターフェースであり、objは異なるタイプを持つことができる「var」です。

varの外側のtryブロックをnullとして開始することさえできません。どうすればこの問題を解決できますか? objが例外を回避するためにキャストを試みる前に、タイプのType1であるかどうかをチェックする必要があり

var results = //determine the result type here 
try 
{ 
    var calc = (Type1)obj; 
    return calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    return calc.Function(); 
} 

+1

あなたがnull'なので、 ''としてvar'を初期化した場合あなたはそれを期待していますか? 'var'は' object'や 'dynamic'と同じではありません。あなたは実際に 'var'のドキュメントを読むべきです、あなたはそれをはるかに理解していません。 –

+0

私はnullとして初期化するつもりはないと知っています。それは私の主な関心事ではありません。私が探しているのは、データセット、またはtryブロックの実行の有無、またはcatchブロックの実行の有無に基づいたデータテーブルのいずれかになる、「結果」を返すことだけです。 – user5820237

+1

'var'はあなたのコードを難読化でき、悪用しないでください。型を記述すると、コードをもっと読みやすく分かりやすくすることができます。戻り型のメソッドを使用すれば、さらに多くのことができます。 –

答えて

1

ではなく、1のリターンの2点を持っています。

if (obj is Type1) 
{ 
    return (obj as Type1).Function(); 
} 
else 
{ 
    return (obj as Type2).Function(); 
} 

さらに 次の2つの戻り値の型が準拠しなければならないことを戻り値の型を持っていなければならないため、あなたが潜在的にこれを行うことができます(ただし、これは推奨されません):

var result = //type of return type 
    try 
{ 
    var calc = (Type1)obj; 
    result = calc.Function(); 
} 
catch 
{ 
    var calc = (Type2)obj; 
    result = calc.Function(); 
} 
finally 
{ 
return result; 
} 
+0

結果はデー​​タテーブルでも、呼び出しに基づくデータセットでもかまいません。 – user5820237

+0

いずれの場合でも、関数の戻り値の型には両方が含まれている必要があります(戻り値の型は2つの可能な結果に反比例する必要があります) – barakcaf

+0

ありがとうございました。私はあなたの提案を進めるつもりです。 – user5820237

0
このよう

クリーンコードの観点からの最良の方法は、共通のインターフェイスを定義することです。Type1type2は、

interface IFoo 
{ 
    MyType Function(); 
} 

今ではタイプに切り替える必要が簡単にfinallyが適切に処理できるようにあなたのtry/catchのうち、resultを定義することができドント:何、

MyType result = null; 
try 
{ 
    IFoo foo = obj as IFoo; 
    results = foo.Function(); 
} 
catch 
{ 
    ... 
} 
finally 
{ 
    return results; 
} 
関連する問題