2016-12-14 11 views
2

Я использую IDialog в моем боте и один из моих методов, которые выполняются с помощью робота Framework с помощью context.Wait() было два аргумента, а обычно:Аргументы типа для метода IDialogStack.Wait <R> (ResumeAfter <R> резюме) не может быть выведено из использования

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 вызовы показываются как недействительные:

invalid context.wait

если удалить третью Эта ошибка исчезает аргумент из объявления метода.

сообщение, показанное на Visual Studio является:

Аргументы типа для метода IDialogStack.Wait (ResumeAfter резюме) не могут быть выведены из эксплуатации. Попробуйте явно указать аргументы типа.

Я предполагаю, что означает, что я должен назвать context.Wait, как context.Wait<SOMETHING>, но я понятия не имею, что писать вместо SOMETHING.

+0

Я не вещь, добавив дополнительный аргумент заставит все Wait генерировать ошибки. Сделали ли вы какие-либо другие изменения? Можете ли вы опубликовать код метода MainScreenSelectionReceived. –

+0

@SethuBala ошибка исчезает, как только я удаляю третий аргумент из объявления метода – K48

ответ

2

Сделать перегрузку, а не добавлять необязательный аргумент. Теперь ваша подпись метода больше не удовлетворяет требуемому делегату.

Например:

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); 
} 
+0

Но могу ли я знать, почему не так, как в вопросе? Что вызывает там проблему? –

+0

@SethuBala Я не уверен, что вы имеете в виду именно, почему бы и нет в этом вопросе? Проблема заключается в том, что метод ожидает делегата определенной подписи.Добавление параметра в «MainScreenSelectionRecieved» изменяет подпись и, следовательно, больше не удовлетворяет подписке делегата. – Rob

+0

@Rob Dang. Ты прав. Я делал это наоборот, перегрузку для вызова этого метода со значением, отличным от значения по умолчанию. – K48

2

Взгляните на то, как делегат, который передается в 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 
} 

Или передать лямбда-выражение в context.Wait() метода:

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

 Смежные вопросы

  • Нет связанных вопросов^_^