diff --git a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs index 3edd86c90..f68632b75 100644 --- a/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs +++ b/ICSharpCode.Decompiler.Tests/PrettyTestRunner.cs @@ -926,6 +926,12 @@ namespace ICSharpCode.Decompiler.Tests await RunForLibrary(cscOptions: cscOptions); } + [Test] + public async Task Variance([ValueSource(nameof(defaultOptions))] CompilerOptions cscOptions) + { + await RunForLibrary(cscOptions: cscOptions); + } + [Test] public async Task StaticAbstractInterfaceMembers([ValueSource(nameof(roslyn4OrNewerOptions))] CompilerOptions cscOptions) { diff --git a/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Variance.cs b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Variance.cs new file mode 100644 index 000000000..a46a68888 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/Pretty/Variance.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty +{ + public class ExplicitVariantImpl : IVariant + { + string IVariant.Convert(object value) + { + return null; + } + } + + public interface IConstrainedCovariant where T : class + { + T Get(); + } + + public interface IContravariant + { + void Set(T value); + } + + public interface ICovariant + { + T Get(); + } + + public interface IVariant + { + TOut Convert(TIn value); + } + + public static class VarianceConversions + { + public static IEnumerable Widen(IEnumerable xs) + { + return xs; + } + + public static Action Narrow(Action a) + { + return a; + } + + public static Func ToObjectFunc(Func f) + { + return f; + } + + public static ICovariant WidenInterface(ICovariant c) + { + return c; + } + + public static IContravariant NarrowInterface(IContravariant c) + { + return c; + } + + public static VariantFunc ConvertDelegate(VariantFunc f) + { + return f; + } + + public static void ArgumentConversion(ICovariant c, IContravariant c2) + { + UseCovariant(c); + UseContravariant(c2); + } + + private static void UseCovariant(ICovariant c) + { + } + + private static void UseContravariant(IContravariant c) + { + } + } + + public delegate TResult VariantFunc(TArg arg); +}