私は次のインターフェースを持っています:
public interface IValidationSystem<T>
{
IAsyncEnumerable<ValidationResult> ValidateAsync(T obj);
}
そして、私はそれをこのように実装しようとしています:
public class Foo
{ }
public class Bar
{ }
public class BarValidationSystem : IValidationSystem<T>
{
public async IAsyncEnumerable<ValidationResult> ValidateAsync(Bar bar)
{
var foo = await GetRequiredThingAsync();
return GetErrors(bar, foo).Select(e => new ValidationResult(e)).ToAsyncEnumerable();
}
private static IEnumerable<string> GetErrors(Bar bar, Foo foo)
{
yield return "Something is wrong";
yield return "Oops something else is wrong";
yield return "And eventually, this thing is wrong too";
}
private Task<Foo> GetRequiredThingAsync()
{
return Task.FromResult(new Foo());
}
}
しかし、これはコンパイルされません:
CS1622 イテレータから値を返すことはできません。yield return ステートメントを使用して値を返すか、yield break を使用して反復を終了します。
列挙可能なものを反復することで修正できることはわかっています:
foreach (var error in GetErrors(bar, foo))
{
yield return new ValidationResult(error);
}
または、次を返すことによってTask<IEnumerable<ValidationResult>>
:
public async Task<IEnumerable<ValidationResult>> ValidateAsync(Bar bar)
{
var foo = await GetRequiredThingAsync;
return GetErrors(bar, foo).Select(e => new ValidationResult(e));
}
IAsyncEnumerable
しかし、私の場合、返品できない理由を理解したいと思います。「古典的な」IEnumerable
メソッドを書くときは、IEnumerable
複数の値を返すか、複数の値を返すことができます。で同じことを行うことが許可されていないのはなぜIAsyncEnumerable
ですか?