C# 使用泛型的接口“无法隐式转换类型”

C# 使用泛型的接口“无法隐式转换类型”,c#,generics,C#,Generics,如果我有一个接受从IUser派生的泛型类型的类,如何避免此错误消息 无法将类型ElimCMS.Service.Users.someclass隐式转换为ElimCMS.Service.Users.someclass。存在显式转换。是否缺少强制转换 范例 public interface Isomeclass<TUser> where TUser : class, IUser { string test(TUser user); TUser retur

如果我有一个接受从IUser派生的泛型类型的类,如何避免此错误消息

无法将类型ElimCMS.Service.Users.someclass隐式转换为ElimCMS.Service.Users.someclass。存在显式转换。是否缺少强制转换

范例

   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>();

更改您的声明

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

并在某个类中适当地重新定义测试方法以匹配


如果您使用的是C4 Visual Studio 2010或更高版本,则可以执行此操作。那会给你你需要的。如果您使用的是以前的版本,那么,您必须恢复到object并执行一些强制转换。

更改您的声明

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

并在某个类中适当地重新定义测试方法以匹配

如果您使用的是C4 Visual Studio 2010或更高版本,则可以执行此操作。那会给你你需要的。如果您使用的是以前的版本,那么,您必须恢复到object并执行一些强制转换。

Isomeclass和someclass不兼容赋值。事实上,Isomeclass和Isomeclass不能相互分配

由于要将类型参数TUser指定的类型同时用作输入和输出参数,因此不能将类型参数声明为协变或逆变,因此在接口/类中保留当前方法签名的唯一解决方案似乎是将列表实例键入IUser:

Isomeclass和someclass不兼容赋值。事实上,Isomeclass和Isomeclass不能相互分配

由于要将类型参数TUser指定的类型同时用作输入和输出参数,因此不能将类型参数声明为协变或逆变,因此在接口/类中保留当前方法签名的唯一解决方案似乎是将列表实例键入IUser:


这是因为具有不同类型的泛型彼此不兼容。为了解决这个问题,您可以使用

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

    string test(TUser user);
    TUser returnUser();
}
但是,这将破坏测试方法,因为它不再是类型安全的。要解决这个问题,您可以将参数用户类型更改为IUser,它将像以前一样工作


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

发生这种情况是因为具有不同类型的泛型彼此不兼容。为了解决这个问题,您可以使用

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

    string test(TUser user);
    TUser returnUser();
}
但是,这将破坏测试方法,因为它不再是类型安全的。要解决这个问题,您可以将参数用户类型更改为IUser,它将像以前一样工作


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

您使用的是哪个C版本?您使用的是哪个C版本?
public interface Isomeclass<out TUser>
   where TUser : class, IUser
{

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