using System; using System.Collections.Generic; #nullable enable namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty { internal class Issue3909 { public abstract class Base { public virtual T? Unconstrained(T? value) { return value; } public virtual T? ReferenceType(T? value) where T : class { return value; } public virtual T? ReferenceTypeNullable(T? value) where T : class? { return value; } public virtual T? NotNull(T? value) where T : notnull { return value; } public virtual T? ValueType(T? value) where T : struct { return value; } public virtual U? ReturnOnly() { return default(U); } public virtual T?[] Nested(T?[] values) { return values; } public virtual T Identity(T value) { return value; } } public sealed class Derived : Base { public override T? Unconstrained(T? value) where T : default { return value; } public override T? ReferenceType(T? value) where T : class { return value; } public override T? ReferenceTypeNullable(T? value) where T : class { return value; } public override T? NotNull(T? value) where T : default { return value; } public override T? ValueType(T? value) { return value; } public override U? ReturnOnly() where U : default { return default(U); } public override T?[] Nested(T?[] values) where T : default { return values; } public override T Identity(T value) { return value; } } public interface IRoundTrip { T? RoundTrip(T? value); } public class ExplicitImpl : IRoundTrip { T? IRoundTrip.RoundTrip(T? value) where T : default { return value; } } public class Node { } public abstract class ConstrainedBase { public virtual T? ClassType(T? value) where T : Node { return value; } public virtual T? DelegateType(T? value) where T : Delegate { return value; } public virtual T? EnumType(T? value) where T : Enum { return value; } public virtual T? InterfaceType(T? value) where T : IDisposable { return value; } public virtual List NestedGeneric(List values) { return values; } public virtual TItem? PartiallyAnnotated(TItem? value, TOther other) { return value; } } public sealed class ConstrainedDerived : ConstrainedBase { public override T? ClassType(T? value) where T : class { return value; } public override T? DelegateType(T? value) where T : class { return value; } public override T? EnumType(T? value) where T : default { return value; } public override T? InterfaceType(T? value) where T : default { return value; } public override List NestedGeneric(List values) where T : default { return values; } public override TItem? PartiallyAnnotated(TItem? value, TOther other) where TItem : default { return value; } } public class ClassTypeChainBase where TOuter : Node { public virtual T? Chained(T? value) where T : TOuter { return value; } } public sealed class ClassTypeChainDerived : ClassTypeChainBase where TOuter : Node { public override T? Chained(T? value) where T : class { return value; } } public class ReferenceTypeChainBase where TOuter : class { public virtual T? Chained(T? value) where T : TOuter { return value; } } public sealed class ReferenceTypeChainDerived : ReferenceTypeChainBase where TOuter : class { public override T? Chained(T? value) where T : default { return value; } } public class ContainerBase where TOuter : class { public virtual TOuter? Pick(TItem item) { return null; } } public sealed class ContainerDerived : ContainerBase where TOuter : class { public override TOuter? Pick(TItem item) { return null; } } } }