@@ -307,6 +307,14 @@ public Conversion ExplicitConversion(IType fromType, IType toType)
307307 return UserDefinedExplicitConversion ( null , fromType , toType ) ;
308308 }
309309
310+ Conversion ExplicitConversionNotUserDefined ( IType fromType , IType toType )
311+ {
312+ Conversion c = ImplicitConversion ( fromType , toType , allowUserDefined : false , allowTuple : false ) ;
313+ if ( c != Conversion . None )
314+ return c ;
315+ return ExplicitConversionImpl ( fromType , toType ) ;
316+ }
317+
310318 Conversion ExplicitConversionImpl ( IType fromType , IType toType )
311319 {
312320 // This method is called after we already checked for implicit conversions,
@@ -971,16 +979,31 @@ Conversion SelectOperator(IType mostSpecificSource, IType mostSpecificTarget, IL
971979 return Conversion . None ;
972980
973981 if ( selected . Count == 1 )
974- return Conversion . UserDefinedConversion ( selected [ 0 ] . Method , isLifted : selected [ 0 ] . IsLifted , isImplicit : isImplicit , conversionBeforeUserDefinedOperator : ExplicitConversion ( source , mostSpecificSource ) , conversionAfterUserDefinedOperator : ExplicitConversion ( mostSpecificTarget , target ) ) ;
982+ {
983+ return Conversion . UserDefinedConversion ( selected [ 0 ] . Method ,
984+ isLifted : selected [ 0 ] . IsLifted ,
985+ isImplicit : isImplicit ,
986+ conversionBeforeUserDefinedOperator : ExplicitConversionNotUserDefined ( source , mostSpecificSource ) ,
987+ conversionAfterUserDefinedOperator : ExplicitConversionNotUserDefined ( mostSpecificTarget , target ) ) ;
988+ }
975989
976990 int nNonLifted = selected . Count ( s => ! s . IsLifted ) ;
977991 if ( nNonLifted == 1 )
978992 {
979993 var op = selected . First ( s => ! s . IsLifted ) ;
980- return Conversion . UserDefinedConversion ( op . Method , isLifted : op . IsLifted , isImplicit : isImplicit , conversionBeforeUserDefinedOperator : ExplicitConversion ( source , mostSpecificSource ) , conversionAfterUserDefinedOperator : ExplicitConversion ( mostSpecificTarget , target ) ) ;
981- }
982-
983- return Conversion . UserDefinedConversion ( selected [ 0 ] . Method , isLifted : selected [ 0 ] . IsLifted , isImplicit : isImplicit , isAmbiguous : true , conversionBeforeUserDefinedOperator : ExplicitConversion ( source , mostSpecificSource ) , conversionAfterUserDefinedOperator : ExplicitConversion ( mostSpecificTarget , target ) ) ;
994+ return Conversion . UserDefinedConversion ( op . Method ,
995+ isLifted : op . IsLifted ,
996+ isImplicit : isImplicit ,
997+ conversionBeforeUserDefinedOperator : ExplicitConversionNotUserDefined ( source , mostSpecificSource ) ,
998+ conversionAfterUserDefinedOperator : ExplicitConversionNotUserDefined ( mostSpecificTarget , target ) ) ;
999+ }
1000+
1001+ return Conversion . UserDefinedConversion ( selected [ 0 ] . Method ,
1002+ isLifted : selected [ 0 ] . IsLifted ,
1003+ isImplicit : isImplicit ,
1004+ isAmbiguous : true ,
1005+ conversionBeforeUserDefinedOperator : ExplicitConversionNotUserDefined ( source , mostSpecificSource ) ,
1006+ conversionAfterUserDefinedOperator : ExplicitConversionNotUserDefined ( mostSpecificTarget , target ) ) ;
9841007 }
9851008
9861009 Conversion UserDefinedImplicitConversion ( ResolveResult fromResult , IType fromType , IType toType )
0 commit comments