无法从用法推断出方法 IDialogStack.Wait<R>(ResumeAfter<R> resume) 的类型参数

The type arguments for method IDialogStack.Wait<R>(ResumeAfter<R> resume) cannot be inferred from the usage

我在我的机器人中使用 IDialog,我的方法之一由 Bot Framework 通过 context.Wait() 执行,像往常一样有两个参数:

public async Task MainScreenSelectionReceived(IDialogContext context, 
                       IAwaitable<IMessageActivity> argument)

我想向此方法添加第三个可选参数,如果我直接从代码中的某个位置 运行 此方法(而不是当 Bot Framework 运行 在 context.Wait() 之后并收到来自用户的消息)。

所以我改方法如下:

public async Task MainScreenSelectionReceived(IDialogContext context, 
                       IAwaitable<IMessageActivity> argument, 
                       bool doNotShowPrompt = false)

因此,现在所有 context.Wait 调用都显示为无效:

如果我从方法声明中删除第三个参数,该错误就会消失。

Visual Studio显示的消息是:

The type arguments for method IDialogStack.Wait(ResumeAfter resume) cannot be inferred from the usage. Try specifying the type arguments explicitly.

我认为这意味着我应该将 context.Wait 称为 context.Wait<SOMETHING>,但我不知道该写什么而不是 SOMETHING

重载,而不是添加可选参数。您的方法签名现在不再满足所需的委托。

例如:

public async Task MainScreenSelectionReceived(IDialogContext context, 
                       IAwaitable<IMessageActivity> argument, bool doNotShowPrompt) 
{
    //Original code here
}

public async Task MainScreenSelectionReceived(IDialogContext context, 
                       IAwaitable<IMessageActivity> argument) 
{
    return await MainScreenSelectionReceived(context, argument, false);
}

看一下传递给 context.Wait() 的委托的声明方式:

public delegate Task ResumeAfter<in T>(IDialogContext context, IAwaitable<T> result);

您可以看到此方法需要传递一个具有确切签名 MainScreenSelectionReceived(IDialogContext context, IAwaitable<IMessageActivity> argument) 的委托。

您可以创建一个直接调用的重载方法:

MainScreenSelectionReceived(IDialogContext context, IAwaitable<IMessageActivity> argument)
     => MainScreenSelectionReceived(context, argument, false);

MainScreenSelectionReceived(IDialogContext context, IAwaitable<IMessageActivity> argument,
bool doNotShowPrompt)
{
    // Do stuff here
}

将lambda表达式传递给context.Wait()方法:

context.Wait((c, a) => MainScreenSelectionReceived(c, a, false));