We're trying to resolve a constrained call to {[S.P.CoreLib]System.IComparable``1<StructGenericString``1<System.__Canon>>.CompareTo(StructGenericString``1<__Canon>)} on type {[repro]StructGenericString``1<System.__Canon>}.
Debug.Assert(potentialMatchingInterfaces != 0);
ILCompiler.Compiler.dll!ILCompiler.TypeExtensions.TryResolveConstraintMethodApprox(Internal.TypeSystem.TypeDesc constrainedType, Internal.TypeSystem.TypeDesc interfaceType, Internal.TypeSystem.MethodDesc interfaceMethod, out bool forceRuntimeLookup, ref Internal.TypeSystem.DefaultInterfaceMethodResolution staticResolution) Line 486 C#
ILCompiler.Compiler.dll!Internal.IL.ILImporter.ImportCall(Internal.IL.ILOpcode opcode, int token) Line 409 C#
ILCompiler.Compiler.dll!Internal.IL.ILImporter.ImportBasicBlock(Internal.IL.ILImporter.BasicBlock basicBlock) Line 585 C#
ILCompiler.Compiler.dll!Internal.IL.ILImporter.ImportBasicBlocks() Line 308 C#
> ILCompiler.Compiler.dll!Internal.IL.ILImporter.Import() Line 166 C#
Repro program here:
// Licensed to the .NET Foundation under one or more agreements.// The .NET Foundation licenses this file to you under the MIT license.usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Runtime.CompilerServices;publicclassProgram{privatestaticints_ReturnCode=100;privatestaticvoidAssertEquals<T>(Texpected,Tactual,stringvalues="",[CallerLineNumber]intline=0){if(!expected.Equals(actual)){Console.WriteLine($"{values}{expected} != {actual}, L{line}");s_ReturnCode++;}}publicstaticintMain(){GetTypeTests();returns_ReturnCode;}privatestaticvoidGetTypeTests(){AssertEquals("System.Collections.Generic.ObjectComparer`1[StructGenericString`1[System.String]]",Comparer<StructGenericString<string>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectComparer`1[StructGenericString`1[System.Object]]",Comparer<StructGenericString<object>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectComparer`1[StructGenericString`1[StructGeneric`1[System.String]]]",Comparer<StructGenericString<StructGeneric<string>>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectComparer`1[StructGenericString`1[StructGeneric`1[System.Object]]]",Comparer<StructGenericString<StructGeneric<object>>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableComparer`1[StructGenericString`1[System.String]]",Comparer<StructGenericString<string>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableComparer`1[StructGenericString`1[System.Object]]",Comparer<StructGenericString<object>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableComparer`1[StructGenericString`1[StructGeneric`1[System.String]]]",Comparer<StructGenericString<StructGeneric<string>>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableComparer`1[StructGenericString`1[StructGeneric`1[System.Object]]]",Comparer<StructGenericString<StructGeneric<object>>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectEqualityComparer`1[StructGenericString`1[System.String]]",EqualityComparer<StructGenericString<string>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectEqualityComparer`1[StructGenericString`1[System.Object]]",EqualityComparer<StructGenericString<object>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectEqualityComparer`1[StructGenericString`1[StructGeneric`1[System.String]]]",EqualityComparer<StructGenericString<StructGeneric<string>>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.ObjectEqualityComparer`1[StructGenericString`1[StructGeneric`1[System.Object]]]",EqualityComparer<StructGenericString<StructGeneric<object>>>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableEqualityComparer`1[StructGenericString`1[System.String]]",EqualityComparer<StructGenericString<string>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableEqualityComparer`1[StructGenericString`1[System.Object]]",EqualityComparer<StructGenericString<object>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableEqualityComparer`1[StructGenericString`1[StructGeneric`1[System.String]]]",EqualityComparer<StructGenericString<StructGeneric<string>>?>.Default.GetType().ToString());AssertEquals("System.Collections.Generic.NullableEqualityComparer`1[StructGenericString`1[StructGeneric`1[System.Object]]]",EqualityComparer<StructGenericString<StructGeneric<object>>?>.Default.GetType().ToString());}}publicstructStruct1:IComparable{publiclonga;publiclongb;publicintCompareTo(objectobj){returnobjisStruct1str?b.CompareTo(str.b):1;}}publicstructStructGeneric<T>:IEquatable<StructGeneric<T>>,IComparable<StructGeneric<T>>{publicTt;publicboolEquals(StructGeneric<T>s)=>EqualityComparer<T>.Default.Equals(t,s.t);publicintCompareTo(StructGeneric<T>s)=>Comparer<T>.Default.Compare(t,s.t);}publicstructStructGenericString<T>:IEquatable<string>,IComparable<string>{publicTt;publicboolEquals(strings)=>s==t?.ToString();publicintCompareTo(strings)=>Comparer<string>.Default.Compare(t?.ToString(),s);}structG<T,U>:IEquatable<G<U,T>>{publicboolEquals(G<U,T>x)=>false;}
We're trying to resolve a constrained call to
{[S.P.CoreLib]System.IComparable``1<StructGenericString``1<System.__Canon>>.CompareTo(StructGenericString``1<__Canon>)}on type{[repro]StructGenericString``1<System.__Canon>}.Repro program here: