@@ -2566,11 +2566,11 @@ private BetterResult BetterFunctionMember<TMember>(
2566
2566
2567
2567
// Returns the parameter type (considering params).
2568
2568
static TypeSymbol getParameterTypeAndRefKind ( int i , MemberAnalysisResult memberResolutionResult , ImmutableArray < ParameterSymbol > parameters ,
2569
- TypeWithAnnotations paramsElementTypeOpt , TMember member , out RefKind parameter1RefKind )
2569
+ TypeWithAnnotations paramsElementTypeOpt , TMember member , out RefKind parameterRefKind )
2570
2570
{
2571
2571
ParameterSymbol parameter = getParameterOrExtensionParameter ( i , memberResolutionResult , parameters , member ) ;
2572
2572
2573
- parameter1RefKind = parameter . RefKind ;
2573
+ parameterRefKind = GetParameterBetternessRefKind ( parameter , member ) ;
2574
2574
2575
2575
var type = parameter . Type ;
2576
2576
if ( memberResolutionResult . Kind == MemberResolutionKind . ApplicableInExpandedForm &&
@@ -2631,7 +2631,10 @@ static BetterResult preferValOverInOrRefInterpolatedHandlerParameters(
2631
2631
Debug . Assert ( ! isInterpolatedStringHandlerConversion || arguments [ i ] is BoundUnconvertedInterpolatedString or BoundBinaryOperator { IsUnconvertedInterpolatedStringAddition : true } ) ;
2632
2632
}
2633
2633
2634
- if ( p1 . RefKind == RefKind . None && isAcceptableRefMismatch ( p2 . RefKind , isInterpolatedStringHandlerConversion ) )
2634
+ RefKind refKind1 = GetParameterBetternessRefKind ( p1 , m1 . Member ) ;
2635
+ RefKind refKind2 = GetParameterBetternessRefKind ( p2 , m2 . Member ) ;
2636
+
2637
+ if ( refKind1 == RefKind . None && isAcceptableRefMismatch ( refKind2 , isInterpolatedStringHandlerConversion ) )
2635
2638
{
2636
2639
if ( valOverInOrRefInterpolatedHandlerPreference == BetterResult . Right )
2637
2640
{
@@ -2642,7 +2645,7 @@ static BetterResult preferValOverInOrRefInterpolatedHandlerParameters(
2642
2645
valOverInOrRefInterpolatedHandlerPreference = BetterResult . Left ;
2643
2646
}
2644
2647
}
2645
- else if ( p2 . RefKind == RefKind . None && isAcceptableRefMismatch ( p1 . RefKind , isInterpolatedStringHandlerConversion ) )
2648
+ else if ( refKind2 == RefKind . None && isAcceptableRefMismatch ( refKind1 , isInterpolatedStringHandlerConversion ) )
2646
2649
{
2647
2650
if ( valOverInOrRefInterpolatedHandlerPreference == BetterResult . Left )
2648
2651
{
@@ -2670,6 +2673,16 @@ static bool isAcceptableRefMismatch(RefKind refKind, bool isInterpolatedStringHa
2670
2673
}
2671
2674
}
2672
2675
2676
+ private static RefKind GetParameterBetternessRefKind < TMember > ( ParameterSymbol parameter , TMember member ) where TMember : Symbol
2677
+ {
2678
+ // For static extension members, the ref kind of the extension parameter shouldn't affect betterness.
2679
+ bool isExtensionParameterOfStaticExtensionMember = parameter is { ContainingSymbol : TypeSymbol { IsExtension : true , ExtensionParameter : var extensionParameter } }
2680
+ && member . IsStatic
2681
+ && object . ReferenceEquals ( parameter , extensionParameter ) ;
2682
+
2683
+ return isExtensionParameterOfStaticExtensionMember ? RefKind . None : parameter . RefKind ;
2684
+ }
2685
+
2673
2686
/// <summary>
2674
2687
/// Returns true if the overload required a function type conversion to infer
2675
2688
/// generic method type arguments or to convert to parameter types.
0 commit comments