无法将类型“bool”隐式转换为“System.Threading.Tasks.Task<bool>”。

32

我遇到了这个错误: "无法将类型'bool'隐式转换为'system.threading.tasks.task bool'" 在我的服务实现代码中。你能帮我纠正一下代码吗。

public Task<bool> login(string usn, string pwd)
    {
        DataClasses1DataContext auth = new DataClasses1DataContext();
        var message = from p in auth.Users
                      where p.usrName == usn && p.usrPass == pwd
                      select p;
        if (message.Count() > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
2个回答

30

您需要明确指定您希望此操作是异步执行还是同步执行。

异步操作 的一个示例:

public async Task<bool> login(string usn, string pwd)
{
    DataClasses1DataContext auth = new DataClasses1DataContext();
    var message = await (from p in auth.Users
                  where p.usrName == usn && p.usrPass == pwd
                  select p);
    if (message.Count() > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

如果您不需要它成为异步操作,请尝试以下方法:

public bool login(string usn, string pwd)
{
    DataClasses1DataContext auth = new DataClasses1DataContext();
    var message = from p in auth.Users
                  where p.usrName == usn && p.usrPass == pwd
                  select p;
    if (message.Count() > 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

注意: asyncawait 与 .NET 4.5 和 C# 5.0 及更高版本兼容。


17
如果你添加 Task.FromResult,即使你的方法不是 async,也可以通过伪装让它编译和工作。当我将所有内容都是 async 的 Identity 连接到遗留后端时,我必须这样做。

示例:

public override Task<bool> IsEmailConfirmedAsync(string userId)
{
  var profile = UserProfileType.FetchUserProfile(AtlasBusinessObject.ClientId.ToString(), decimal.Parse(userId));
  Task.FromResult(profile.EmailAddress.NullIfEmpty() != null);
}

3
不要使用 await Task.Delay(0); 造成异步状态机的开销,而是不使用 async 关键字,并执行 return Task.FromResult(profile.EmailAddress.NullIfEmpty() != null); - Scott Chamberlain
@ScottChamberlain 哦,好的。已经修复了。 - toddmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接