Estoy usando un IDialog en mi bot y uno de mis métodos que es ejecutado por Bot Framework a través de context.Wait() tenía dos argumentos, como de costumbre:

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

Quiero agregar un tercer argumento opcional a este método, que especificaré si ejecuto este método directamente desde algún lugar de mi código (a diferencia de cuando Bot Framework lo ejecuta después de context.Wait() y recibe un mensaje de usuario).

Entonces cambio el método de la siguiente manera:

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

Por eso, ahora todas las llamadas context.Wait se muestran como inválidas:

invalid context.wait

Ese error desaparece si elimino el tercer argumento de la declaración del método.

El mensaje que muestra Visual Studio es:

Los argumentos de tipo para el método IDialogStack.Wait (ResumeAfter resume) no se pueden inferir del uso. Intente especificar los argumentos de tipo explícitamente.

Supongo que eso significa que debería llamar a context.Wait como context.Wait<SOMETHING>, pero no tengo idea de qué escribir en lugar de SOMETHING.

2
user6269864 14 dic. 2016 a las 05:53

2 respuestas

La mejor respuesta

Haz una sobrecarga, en lugar de agregar un argumento opcional. La firma de su método ahora ya no satisface al delegado requerido.

Por ejemplo:

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);
}
2
Rob 14 dic. 2016 a las 03:04

Eche un vistazo a la forma en que se declara el delegado que se pasa a context.Wait():

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

Puede ver que este método espera recibir un delegado con la firma exacta MainScreenSelectionReceived(IDialogContext context, IAwaitable<IMessageActivity> argument).

Puede crear un método sobrecargado que se llame directamente:

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

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

O pase una expresión lambda al método context.Wait():

context.Wait((c, a) => MainScreenSelectionReceived(c, a, false));
2
Alex Wiese 14 dic. 2016 a las 03:01