我有这段代码:
public class BaanUserStore<TUser> : IUserStore<TUser>, IUserPasswordStore<TUser> where TUser : Microsoft.AspNet.Identity.IUser
{
public Task<TUser> FindByNameAsync(string userName)
{
//Wrong type!!
return MyUser.Find(userName);
}
}
public class MyUser : IUser
{
public string Id { get; set; }
public string UserName { get; set; }
internal static Task<IUser> Find(string userName)
{
//...
}
}
这给了我这个错误:
无法将类型'System.Threading.Tasks.Task'隐式转换为'System.Threading.Tasks.Task
为什么这是错误的,因为TUser
与IUser
相同?
我该如何解决这个问题?
解决方案:
public class MyUser : IUser
{
public MyUser()
{
}
//Added a constructor with IUser as parameter
public MyUser(IUser user)
{
this.Id = user.Id;
this.UserName = user.UserName;
}
public string Id { get; set; }
public string UserName { get; set; }
//The function is now generic
internal static Task<TUser> Find<TUser>(string userName) where TUser : Microsoft.AspNet.Identity.IUser
{
//...
//Convert to correct type
if (user != null)
return (TUser)Activator.CreateInstance(typeof(TUser), new object[] { user });
else
return default(TUser);
}
}
}
答案 0 :(得分:4)
您的TUser
不一定与界面IUser
相同,它可能是某种继承自IUser
的类型。修复它的最简单方法(如果它适用于你)就是在任何地方使用IUser
:
public class BaanUserStore : IUserStore<IUser>, IUserPasswordStore<IUser>
{
public Task<IUser> FindByNameAsync(string userName)
{
//Wrong type!!
return MyUser.Find(userName);
}
}
另一种解决方法是强制静态方法Find
返回正确的类型:
internal static Task<TUser> Find<TUser>(string userName) where TUser : Microsoft.AspNet.Identity.IUser
{
//...
}
在这种情况下,您必须在调用方法时显式提供类型:
return MyUser.Find<TUser>(userName);
答案 1 :(得分:0)
您的Find方法返回Task<IUser>
但FindByNameAsync返回Task<TUser>
。这种方式没有拳击转换(参见评论中的链接或the articles by Eric Lippert)
你应该使你的find方法通用:
internal static Task<TUser> Find<TUser>(string userName)
{
//...
}