2009-07-31 1 views
1

私はインターフェースを使うのは初めてです。このシナリオでリスト<MyInterface>を返すにはどうすればいいですか

私は医療保険請求に関する情報を返すメソッド(GetClaimDetails)を書いています。クレームタイプAの場合、ClaimDetailAクラスのリストが返されます。クレームタイプBの場合は、ClaimDetailBクラスのリストを返します。これらのクラスはどちらも共通のプロパティを共有しますが、それぞれ固有のプロパティを持ちます。共通プロパティはインタフェースで実装されます。

IClaimDetailという名前のインターフェイスを抽出し、両方を実装するように設定しました。私はIClaimDetailを返し、それがIClaimsDetailを実装するオブジェクトのインスタンスを返すようにする方法を設定した場合、私は、コンパイラのメッセージに

を得るにSystem.Collections「に 『System.Collections.Generic.List DentalClaimDetail』暗黙的にタイプを変換できません」 .Generic.List IClaimDetail '

private static List<IClaimDetail> GetClaimDetailsB(string claimNumber, string connectionStringName) 
     { 

      var claimReportRows = new List<DentalClaimDetail>(); 
     ..removed for brevity 
     return claimReportRows; 
    } 



    public class DentalClaimDetail : IClaimDetail 
    { 
    ... 
    } 

メソッドがインターフェイスを返すときは、インターフェイスを実装するオブジェクトを返すだけです。正しい?私は間違って何をしていますか?

+0

Daniel Whiteの答えを参照してください。 .NET 4ではこれをサポートする必要があります(タイプ共分散) – Jimmy

答えて

7
var claimReportRows = new List<IClaimDetail>(); 

これを変更してください。その後、まだDentalClaimDetailを挿入することができます。一覧<IClaimDetail>は1種類であるので

+0

うわー。十分に簡単です。ありがとう!! –

+1

@ asp316 - これを行う必要がある理由を理解せずにコードを変更するだけではありません。パート1から始まるEric Lippert氏のシリーズを読んでください(blogs.msdn.com/ericlippert/archive/...)。パート1から始めると、おそらくコードがうまくいくと思われる理由が説明されます。パート11までは、しかし、C#4.0ではなぜ同じようなことが起こるのでしょうか? –

+0

申し訳ありませんが、実際のリンク:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx –

1

ジェネリック医薬品は、実際には、オンザフライで、すべての一般的な引数のコンパイル時にタイプを生成し、あなたはそのためのコンパイラエラーが発生しますので、一覧<DentalClaimDetail>は、実際には別のタイプです。

はい、ラメが、ダニエル・A.ホワイト

var claimReportRows = new List<IClaimDetail>(); 

(あなたはちょうどあなたがLINQのを使用している場合を除き、直接型を使用することができるはずですが)し、コードを持っていることによって概説として、単にあなたの呼び出しを変更DentalClaimDetailをIClaimDetailにキャストするためにキャスティングを使用することは、このトリックを行うべきです。このことができます

List<IClaimDetail> claimReportRows = new List<IClaimDetail>(); 
//...populate Dentail Claims Here... 
foreach(DentalClaimDetail dcd in dentalClaims) 
{ 
    claimReportRows.Add((IClaimDetail)dcd); 
} 
return claimReportRows. 

希望:LINQのを使用していない場合は は、あなたのような何かを行うことができます!

関連する問題