使用泛型的接口"无法隐式转换类型"

Miz*_*rym 1 c# generics

如果我有一个类接受从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>();
Run Code Online (Sandbox Code Playgroud)

Der*_*all 5

这是因为具有不同类型的泛型彼此不兼容.要解决此问题,您可以Isomeclass使用通用参数声明您的通用参数

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

    string test(TUser user);
    TUser returnUser();
}
Run Code Online (Sandbox Code Playgroud)

但是,这将破坏该test方法,因为它将不再是类型安全的.要解决此问题,您可以将参数user类型更改为IUser,它将像以前一样工作.

这取决于您使用的C#版本.对于某些旧版本,泛型不能声明为协变,这意味着您必须将赋值目标更改为与分配给它的对象相同的类型.