次のようなインターフェースがあるとします。
using System.Threading.Tasks;
...
public interface IFoo
{
Task doIt();
Task<bool> doItAndReturnStuff();
}
そして、このインタフェースを実装しているクラスの1つがたまたま非同期メソッドを必要としないのですが、どうすればこれらの関数を正しくオーバーライドできますか?
つまり、どのようにしてTaskオブジェクトにラップされた "void"と "bool"を正しく返すのですか?
例えば:
public class FooHappensToNotNeedAsync : IFoo
{
public override Task doIt()
{
// If I don't return anything here, I get
// error that not all code paths return a value.
// Can I just return null?
}
public override Task<bool> doItAndReturnStuff()
{
// If I want to return true, how to I do it?
// This doesn't work:
return true;
}
}
注 - このインターフェースを実装しているクラスの中にはタスクのものを完全に取り除くことはできないあります実際には非同期です。
ありがとう
何を達成しようとしているのかは明確ではありませんが、1つのアプローチ(「通常の」コードに最も似ている)は、おそらくそれらを非同期メソッドにすることです。
public async Task DoIt()
{
// No-op
}
public async Task<bool> DoItAndReturnStuff()
{
return true;
}
何もないawait
式、メソッドはとにかく同期的に完了します。各メソッドについて警告が表示されますが、このコードの場合は、#pragma
。
代わりに - そして私はもっと単純に必要としないという観点から#pragma
警告を無効にする - 使用することになりますTask.FromResult
:
public Task DoIt()
{
// Returns a Task<bool>, but that's okay - it's still a Task
return Task.FromResult(true);
}
public Task<bool> DoItAndReturnStuff()
{
return Task.FromResult(true);
}
override
基本クラスのメソッドをオーバーライドするのではなく、インターフェイスを実装しているためです。私はCS0161を持っていないのにasync
変更。 - Jon Skeet
return Task.Run(()=>true);
- L.B