我有以下界面:
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
方法时,您可以 return anIEnumerable
或 yield return 多个值。为什么我不允许这样做IAsyncEnumerable
?