diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/AsyncStreams.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/AsyncStreams.cs index f7ea3f010..0cd334e4f 100644 --- a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/AsyncStreams.cs +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/AsyncStreams.cs @@ -6,6 +6,12 @@ using System.Threading.Tasks; namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty { + public enum AsyncStreamColor + { + Red, + Green + } + public class AsyncStreams { public static async IAsyncEnumerable CountTo(int until) @@ -85,6 +91,33 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty await Task.Yield(); } } + + public static async IAsyncEnumerable ConstrainedGenericYield(IAsyncEnumerable items) where T : IAsyncStreamEntry + { + await foreach (T item in items) + { + yield return item; + } + } + + public static IEnumerable BoxedValues() + { + yield return true; + yield return 'a'; + yield return AsyncStreamColor.Green; + } + + public static async IAsyncEnumerable BoxedValuesAsync() + { + yield return true; + await Task.Yield(); + yield return 'a'; + yield return AsyncStreamColor.Green; + } + } + + public interface IAsyncStreamEntry + { } public struct TestStruct diff --git a/ICSharpCode.Decompiler/CSharp/StatementBuilder.cs b/ICSharpCode.Decompiler/CSharp/StatementBuilder.cs index da0646022..5686389b3 100644 --- a/ICSharpCode.Decompiler/CSharp/StatementBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/StatementBuilder.cs @@ -433,7 +433,8 @@ namespace ICSharpCode.Decompiler.CSharp protected internal override TranslatedStatement VisitYieldReturn(YieldReturn inst) { - var elementType = currentFunction.ReturnType.GetElementTypeFromIEnumerable(typeSystem, true, out var isGeneric); + var elementType = currentFunction.AsyncReturnType + ?? currentFunction.ReturnType.GetElementTypeFromIEnumerable(typeSystem, true, out _); var expr = exprBuilder.Translate(inst.Value, typeHint: elementType) .ConvertTo(elementType, exprBuilder, allowImplicitConversion: true); return new YieldReturnStatement {