Рассмотрим:Нет предупреждения, когда я забыл `await` на метод интерфейса вызова
using System.Threading.Tasks;
class Program
{
static void Main(string[] args)
{
C c = new C();
c.FooAsync(); // warning CS4014: Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.
((I)c).FooAsync(); // No warning
}
}
class C : I
{
public async Task FooAsync()
{
}
}
interface I
{
Task FooAsync();
}
Если я вызываю метод асинхронной непосредственно на c
объекта, я получаю предупреждение компилятора. Здесь есть потенциальная ошибка, поэтому я рад предупреждению.
Однако, если я делаю тот же вызов по методу интерфейса, я не получаю предупреждения. В этом коде было бы легко пропустить ошибку.
Как я могу гарантировать, что я не ошибаюсь? Есть ли образец, который я могу применить для защиты себя?
Хороший вопрос ... Поскольку нельзя определить методы интерфейса async, я не ожидаю, что компилятор даст вам предупреждение в этом случае. Может быть, кто-то знает, делает ли R # (или есть плагин для него). –
ReSharper не поймает его. – cadrell0
Возможно, [NDepend] (http://www.ndepend.com/) может найти его с пользовательским запросом «CQL» во время процесса сборки, но поскольку «async» - это трюк компилятора и на самом деле не скомпилирован в ИЛ, я в этом сомневаюсь. –