2016-04-14 11 views
0

戻り値の型がIEnumerable<T>のメソッドがあり、このメソッドの出力を変数に取り込む必要があります。変数を宣言するためにvarを使用することはできません。なぜなら変数はtry/catchブロック外で宣言しなければならないからです。だから、私の変数の宣言にはどのような具体的なTypeを使用できますか?それは私のメソッドのIEnumerable<T>出力を受け入れるでしょうか?ここでは、このシナリオは次のようになります。私はList<T>としてtempを宣言IEnumerableを受け入れる具体的な型<T>

IEnumerable<string> CalleeMethod() {...} 

IEnumerable<string> CallerMethod() 
{ 
    List<string> temp = null; 
    try 
    { 
     temp = CalleeMethod(); 
    } 
    catch(Exception exception) 
    { 
     Debug.WriteLine(exception.GetBaseException().Message); 
    } 
    return temp; 
} 

この例では動作しない場合ので、私はエラーを取得:cannot convert IEnumerable<T> to List<T>。私は.ToList()と呼ぶことができ、CalleeMethod()の出力をList<T>にキャストできますが、tempの変数をキャストする必要がなくCalleeMethod()IEnumerable<T>の出力を保持できる具体的なタイプで定義したいと考えています。だから、どのような具体的なタイプtempを宣言すればcannot convert...エラーを投げないでしょうか?

ありがとうございました!

+2

'IEnumerable temp = null;'? –

+0

具体的なタイプはありませんか? –

+1

@タイラージョーンズはもちろんです。あなたは 'IEnumerable CalleeMethod'を宣言していますので、使用できる唯一のタイプは' IEnumerable'か、子ではなく、親です。 –

答えて

3

IEnumerable<String>を試しましたか?

+0

はい、インタフェースではなく具体的​​なタイプが必要です。 –

+0

アクセス権のある具体的なタイプはありません。インターフェイスも型です。 – Joey

+1

@TylerJonesあなたの質問から非常に関連性の高い情報を除外しない限り、あなたはしません。あなたの質問に基づいて、 'IEnumerable 'が正しい答えです。あなたが何か他のものを望むなら、あなたが本当に何をしているのか聞いてください。 – hvd

0

だけIEnumerable<string> temp = Enumerable.Empty<String>();

+0

非常にクールです!私はEnumerable.Empty()について知らなかった –

+0

このメソッドは 'var'を使用することもできます... –

+2

@TylerJonesなぜこの提案はChris Pitmanのものよりも優れている/違うのですか? )...また、R# 'var'を持っている場合<->具体的な型変換は半分離れています... –

0

@hvdが正しいかを使用します。私はあなたにいくつかの概念が交差していると思います。 'IEnumerable T'は 'IEnumerable string'とは異なります。これは単純な汎用バージョンです...

public class GenericTest 
{ 
    public IEnumerable<T> CalleeMethod<T>() where T : class 
    { 
     return new List<T>(); 
    } 
} 
[TestMethod] 
public void IEnumberableT() 
{ 
    var x = new GenericTest(); 
    IEnumerable<string> result = x.CalleeMethod<string>(); 
} 
関連する問題