2016-05-24 17 views
0

現在、インタフェースXを継承するインタフェースYをインタフェースYに継承するオブジェクトを渡すときに、次のエラーメッセージが表示されます。インタフェースXを実装するオブジェクトを、インタフェースXから継承するインタフェースYに渡すときのエラー。C#

は、暗黙的に にタイプ 'InterfaceTestApp.Repositories.IUserModel' を変換できません 'InterfaceTestApp.Lib.IUserModel'。明示的な変換が存在する( あなたはキャストが欠けている?)

は、これは私のテストのセットアップです:

namespace InterfaceTestApp.Repositories 
{ 
    public class UserTestRepo 
    { 
     public IUserModel GetUser() => new UserModel() { Id = 1, Name = "Test" }; 
    } 
} 

namespace InterfaceTestApp.Repositories 
{ 
    public interface IUserModel 
    { 
     int Id { get; set; } 
     string Name { get; set; } 
    } 

    public class UserModel : IUserModel 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

ライブラリ

namespace InterfaceTestApp.Lib 
{ 
    interface IUserModelLib : Repositories.IUserModel { } 
} 

namespace InterfaceTestApp.Lib 
{ 
    class Authentication 
    { 
     public IUserModelLib AuthenticateUser() => new Repositories.UserTestRepo().GetUser(); 
    } 
} 

基本的に

リポジトリ私は何ですか?ここでやろうとしているのは、Libプロジェクトを使用してRepoプロジェクトのどの部分にもアプリケーションが公開されないようにすることです。ご覧のとおり、IUserModelLibは単にパススルーインターフェースです。レポ・プロジェクトのIUserModelからすべてを継承します。

何らかの手動キャスティングをせずにこれを行う方法があるはずです。どんな助けもありがとう。ありがとう!

+1

'IUserModelLib'は' IUserModel'ができることはできますが、その逆はできません。 'IUserModelLib AuthenticateUser()'メソッドから 'IUserModel'を返そうとしましたが、' IUserModel'はそれ自身の宣言の中に 'IUserModelLib'が持つ機能を持っていないので、エラーメッセージです。 – Sam

答えて

1

ここでは、継承の順序/方向を混乱させました。

  • Lib.IUserModelLibは、彼らがUserModelLib.IUserModelLibにassignetことができるという意味ではありません共通のインターフェースを共有するという理由だけでRepositories.IUserModel
  • UserModelRepositories.IUserModel

を実装して実装しています。

  • Repositories.UserTestRepo().GetUser()基本的に私がここでやろうとしていますどのようなレポプロジェクトの任意の部分を露出させないようにすることです代わりにLib.IUserModelLib

Repositories.IUserModelを返すためにRepositories.IUserModel

  • したがってAuthenticateUser()ニーズを返します。 Libプロジェクトを使用するすべてのアプリケーションに適用されます。ご覧のとおり、IUserModelLibは単にパススルーインターフェースです。レポ・プロジェクトのIUserModelからすべてを継承します。あなたの代わりにpublicinternalにクラスを設定し、friend-assembliesを定義し、UserModelクラス、ないIUserModelインターフェースをラップする必要があり、その場合には

  • 。そうすれば、Libを使ってどのプロジェクトにも公開することなく、あなたのLibプロジェクトにUserModelを使うことができます。

    +0

    確認ありがとうございます!大変感謝しています。 ; 0) – Zorthgo

    関連する問題