1

IUserから派生したジェネリック型を受け入れるクラスがある場合、このエラーメッセージを回避するにはどうすればよいですか?

ElimCMS.Service.Users.someclass<ElimCMS.DataModel.Users.User>タイプを暗黙的にに変換することはできませんElimCMS.Service.Users.Isomeclass<ElimCMS.DataModel.Users.IUser>。明示的な変換が存在します(キャストがありませんか?)

   public interface Isomeclass<TUser>
   where TUser : class, IUser
   {

    string test(TUser user);
    TUser returnUser();
   }

   public class someclass<TUser> : Isomeclass<TUser>
   where TUser : class, IUser, new()
   {
    public string test(TUser user)
    {
        string email = user.EMail;
        user.EMail = "changed:" + email;

        return email;
    }


    public TUser returnUser()
    {
        throw new NotImplementedException();
    }
}

 Isomeclass<ElimCMS.DataModel.Users.IUser> servicetest = new someclass<ElimCMS.DataModel.Users.User>();
4

3 に答える 3

5

これは、異なるタイプのジェネリックが相互に互換性がないために発生します。Isomeclassこれを回避するには、ジェネリックパラメーターを共変であると宣言します。

public interface Isomeclass<out TUser>
   where TUser : class, IUser
{

    string test(TUser user);
    TUser returnUser();
}

ただし、testタイプセーフではなくなるため、メソッドが機能しなくなります。これを回避するには、パラメータuserタイプをに変更するIUserと、以前と同じように機能します。

これは、使用しているC#のバージョンによって異なります。一部の古いバージョンでは、ジェネリックを共変として宣言できません。つまり、割り当てターゲットを、割り当てたオブジェクトと同じタイプに変更する必要があります。

于 2012-08-03T13:34:45.853 に答える
2

Isomeclass<ElimCMS.DataModel.Users.IUser>someclass<ElimCMS.DataModel.Users.User>割り当て互換ではありません。実際には、Isomeclass<ElimCMS.DataModel.Users.IUser>互いにIsomeclass<ElimCMS.DataModel.Users.User>割り当てることはできません。

型パラメーターで指定された型TUserを入力パラメーターと出力パラメーターの両方として使用するため、型引数を共変または反変として宣言することはできません。したがって、インターフェイス/クラスで現在のメソッドシグネチャを維持する唯一の解決策は次のようになります。リストインスタンスを入力するにはIUser

new someclass<ElimCMS.DataModel.Users.IUser>();

または、リスト変数を次のように入力しますUser

 Isomeclass<ElimCMS.DataModel.Users.User> servicetest
于 2012-08-03T13:34:00.083 に答える
1

宣言を変更する

public interface Isomeclass<TUser> where TUser : class, IUser
{
    string test(TUser user);
    TUser returnUser();
}

public interface Isomeclass<out TUser> where TUser : class, IUser
{
    string test(IUser user);
    TUser returnUser();
}

test一致するようにメソッドを適切に再定義しsomeclass<TUser>ます。

これは、C#4(Visual Studio 2010)以降を使用している場合に実行できます。それはあなたが必要なものを手に入れるでしょう。以前のバージョンを使用している場合は、元に戻してobjectキャストを行う必要があります。

于 2012-08-03T13:32:49.287 に答える