C# 使用泛型的接口“无法隐式转换类型”
如果我有一个接受从IUser派生的泛型类型的类,如何避免此错误消息 无法将类型ElimCMS.Service.Users.someclass隐式转换为ElimCMS.Service.Users.someclass。存在显式转换。是否缺少强制转换 范例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
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();
}