接线员!不能应用于Task <bool>类型的操作数

时间:2018-02-12 23:48:02

标签: c# datetime

我有以下实现,并在Async Task<bool>方法中添加了ChangeDate()操作,之前它只是bool

在以下行if (!ChangeDate())

  

操作员!不能应用于类型的操作数   任务

 public DateTime Date
 {
    get { return _date; }
    set
    {
      if (!ChangeDate())
      {
         return;
      }

      _date = value.Date;

    }
} 

private async Task<bool> ChangeDate()
{
  if (IsSave)
  {
     await Mvx.Resolve<IUserDialogs>().ConfirmAsync(new ConfirmConfig
     {
        Message = "Are you sure ?",
        OnConfirm = b =>
        {
            if (b)
            {
              Save();
            }
         }
      });
   }
   return true;
 }

2 个答案:

答案 0 :(得分:2)

也许你想要这样的东西......?

public DateTime Date { get; private set; }

public Task SetDateIfUserConfirmsAsync( DateTime proposedDate) 
{ 
     var confirmConfig = new ConfirmConfig() {
         Message = "Are you sure ?",
         OnConfirm = b => { if (b) { this.Date = proposedDate; } }
     }
     await Mvx.Resolve<IUserDialogs>().ConfirmAsync( confirmConfig);
}

您还没有说过您正在使用的UI,但可能您处于按钮回调中,该回调具有同步签名(void return)。在这种情况下,您希望确保捕获任何异常,否则您将永远不会看到它们(异常不会传播回异步void方法的调用方)。有点像这样:

public async void OnButtonClick()
{ 
    try {
        DateTime proposedDate = ...;
        await SetDateIfUserConfirmsAsync( proposedDate)
    } catch (Exception e) {
        // display or log the exception
    }
 }

P.S。在您看到的错误上,&#34;运营商!不能应用于任务&lt; bool&gt;&#34;类型的操作数,这是因为您没有等待任务。如果t的类型为Task&lt; bool&gt;那么&#34;等待t&#34;有类型bool。

答案 1 :(得分:0)

找到了这个答案:How to make an Asynchronous Method return a value?

你需要制作一个异步帮助方法,并调用它而不是只调用你的setter,因为正如@Ron Beyer指出的那样,await调用在属性中不起作用。

替换:

if(!ChangeDate())

使用:

if( !(await ChangeDate()) )