【问题标题】:Operator "!" cannot be applied to operando of type Task<bool> [duplicate]操作员 ”!”不能应用于 Task<bool> 类型的操作数 [重复]
【发布时间】:2016-11-09 21:43:26
【问题描述】:

我从库中获得了以下方法:

IRuleBuilderOptions<T1, T2> MustAsync<T1, T2>(this IRuleBuilder<T1, T2> ruleBuilder, Func<T2, CancellationToken, Task<bool>> predicate);

我使用它如下:

.MustAsync((t2, token) => someAsyncMethodThatReturnsTaskBoolean());

但我不能这样否定该方法:

.MustAsync((t2, token) => !someAsyncMethodThatReturnsTaskBoolean());

因为我得到了错误:

Operator "!" cannot be applied to operand of type Task<bool>

我无法更改方法,因为它来自外部库。

我该如何解决这个问题?

【问题讨论】:

  • ^ 似乎是同样的问题 - async... 另外,您的意思是“操作数”吗?
  • 在这种情况下,“运算符'!='中的答案不能应用于'Task'和'int'类型的操作数”并不能解决问题
  • 使用async lambda 和await,例如.MustAsync(async (t2, token) =&gt; !await someAsyncMethodThatReturnsTaskBoolean());
  • @IvanStoev 这就是答案。可以加一下吗?
  • 我不能,因为问题已作为重复而关闭。没关系,问题解决了:)

标签: c#


【解决方案1】:
async (t2, token) => !(await someAsyncMethodThatReturnsTaskBoolean())

这将完成任务并应用您的 !结果(即布尔值)而不是任务本身。

【讨论】:

  • 应该删除 .Result 答案....因为这只是破坏异步性的好方法
  • 根据您的建议,我收到错误“'await' 运算符只能在异步 lambda 表达式中使用。考虑使用 'async' 修饰符标记此 lambda 表达式
  • 而 Result 只是将 Task 转换为 bool 以消除异步行为
  • 是的,!将始终在函数完成后应用,因此在此处应用它将要求您没有异步行为。我建议添加!当你得到函数的结果时,虽然我不能在没有看到更多代码的情况下准确地确定它在哪里。基本上,当您使用该布尔值时,然后应用!。
  • @MiguelMoura 使用.MustAsync( async (t2, token) =&gt; !(await someAsyncMethodThatReturnsTaskBoolean()));
猜你喜欢
  • 2015-12-11
  • 2013-11-06
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2016-04-26
相关资源
最近更新 更多