2017-04-18 16 views
0

をインスタンス化:は、私は2つのインタフェースを持っている一般的なインタフェース

public interface IReportRow 
{ 
    List<string> ToList(); 
} 

public interface IReportPreparer<T> 
    where T : IReportRow 
{ 
    List<T> GetRows(JObject json); 
    string GetAdditionalData(T reportRow); 
} 

IReportRowインタフェースの実装クラス:私はしようとすると、今

public class SellingReportPreparer : 
IReportPreparer<SellingReportRow> 
{ 
    ...interface implementation 
} 

public class SellingReportRow : IReportRow 
{ 
    ...interface implementation 
} 

IReportPreparerインタフェースを実装するクラスをSellingReportPreparerクラスのインスタンスを次のようにします。

IReportPreparer<IReportRow> preparer = new SellingReportPreparer() 

Intellisenseは、SellingReportPreparer to IReportPreparer<IReportRow>からの明示的な変換が必要であることを伝えます。私はこのように明示的に変換する

: - 両方の方法はIReportRowの同じ実装タイプで動作しますように、私は、一般的なことIReportPreparerインタフェースを必要とするUnable to cast object of type VSKCasco.ReportPrepare.SellingReportPreparer to type VSKCasco.ReportPrepare.IReportPreparer1[VSKCasco.ReportPrepare.IReportRow]

IReportPreparer<IReportRow> preparer = (IReportPreparer<IReportRow>)(new SellingReportPreparer()); 

私は例外を取得します。 SellingReportPreparerのインスタンスを作成するにはどうすればよいですか?あなたはIReportPreparerはその後、このラインは、(H/T @GiladGreen)、しかし

IReportPreparer<IReportRow> preparer = new SellingReportPreparer(); 

をコンパイルしますout

public interface IReportPreparer<out T> 
    where T : IReportRow 
{ 
    //List<T> GetRows(JObject json); 
    //string GetAdditionalData(T reportRow); 
} 

としての一般的なパラメータを指定するようにする必要があり

答えて

0

は、私は「わかります一覧でTを使用している行をコメントアウトしました。リストは共変できません。もしあなたがIEnumerable<T>であれば、それはうまくいくでしょう。今回GetAdditionalDataはまだコメントアウトされ

public interface IReportPreparer<out T> 
    where T : IReportRow 
{ 
    IEnumerable<T> GetRows(JObject json); 
    //string GetAdditionalData(T reportRow); 
} 

注 - 同じ問題、解無し!

をあなたはIReportPreparer支持実装するSellingReportPreparerを言っている:最初のものはコンパイルされませんなぜこの

public class SellingReportPreparer : 
IReportPreparer<IReportRow> 
{ 
    ...interface implementation 
} 

ようIReportRowすべき

public class SellingReportPreparer : 
IReportPreparer<**SellingReportRow**> 
{ 
    ...interface implementation 
} 

ニーズの

+0

これでは不十分です。それでもコンパイルエラー –

+0

をコンパイルできますか? – Valentin

+0

@Jamiec - あなたがコメントに入れた線を含めるなら - はい –

0

タイプSellingReportRowと入力します。しかし、IReportPreparerはSellingReportRowをサポートしていません。IReportRowはすべて知っているので、それ以上の知識は必要ありません。

+0

これがうまくいくので、downvoteを説明してください。私はすべてのOPコードをコピーして、この修正を加えてすべてを動かしました。 – Mart10

+0

「タイプはIReportRowでなければなりません。 OPは共分散について質問していました(たとえ彼らがそれを知らなかったとしても) – Jamiec

+0

@Jamiec "IReportPreparerインターフェイスは汎用であるため、両方のメソッドが同じ実装タイプのIReportRowで動作する必要があります。"この答えはこれと矛盾しない。これは戻り値の型ではなく、SellingReportPreparerにIReportPreparer を実装するように伝えています。 – Mart10

関連する問題