需要转换类型,但是Task <tuser>和Task <iuser>是一样的吗?</iuser> </tuser>

时间:2014-02-03 10:11:43

标签: c# .net .net-4.5

我有这段代码:

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

为什么这是错误的,因为TUserIUser相同? 我该如何解决这个问题?

解决方案:

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

}

2 个答案:

答案 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)
{
    //...
}