@@ -106,6 +106,25 @@ class DerivedOverrideCovariantTransformMock : Transform<object[], object[]>
106
106
public IObservable < Array > Process ( IObservable < Array > source ) => source ;
107
107
}
108
108
109
+ [ Combinator ]
110
+ class MultiArgumentBaseCovariantMock
111
+ {
112
+ public virtual IObservable < object [ ] > Process (
113
+ IObservable < object [ ] > source ,
114
+ IObservable < object > source2 ) => source ;
115
+ }
116
+
117
+ class MultiArgumentDerivedCovariantMock : MultiArgumentBaseCovariantMock
118
+ {
119
+ public override IObservable < object [ ] > Process (
120
+ IObservable < object [ ] > source ,
121
+ IObservable < object > source2 ) => source ;
122
+
123
+ public IObservable < Array > Process (
124
+ IObservable < Array > source ,
125
+ IObservable < string > _ ) => source ;
126
+ }
127
+
109
128
private TResult RunOverload < TSource , TResult , TCombinator > ( TSource value )
110
129
where TCombinator : new ( )
111
130
{
@@ -270,5 +289,30 @@ public void Build_OverloadOverrideAndNewOverloadWithBaseTypeAfterExplicitConvers
270
289
var result = RunOverload < object , Array , DerivedOverrideCovariantTransformMock > ( value ) ;
271
290
Assert . AreEqual ( value , result ) ;
272
291
}
292
+
293
+ [ TestMethod ]
294
+ public void Build_OverloadOverrideAndNewMultiArgumentWithMixedConversions_PreferBaseOverload ( )
295
+ // Override is preferred since method signature is not subsumed and second argument is exact match
296
+ {
297
+ var value = new object [ 1 ] ;
298
+ var source1 = CreateObservableExpression ( Observable . Return ( ( object ) value ) ) ;
299
+ var source2 = CreateObservableExpression ( Observable . Return ( ( object ) value ) ) ;
300
+ var resultProvider = TestCombinatorBuilder < object [ ] , MultiArgumentDerivedCovariantMock > ( source1 , source2 ) ;
301
+ var result = Last ( resultProvider ) . Result ;
302
+ Assert . AreEqual ( value , result ) ;
303
+ }
304
+
305
+ [ TestMethod ]
306
+ public void Build_OverloadOverrideAndNewMultiArgumentWithSpecializedConversion_PreferNewOverload ( )
307
+ // New overload is preferred since the second argument is more specialized
308
+ {
309
+ var value1 = new object [ 1 ] ;
310
+ var value2 = string . Empty ;
311
+ var source1 = CreateObservableExpression ( Observable . Return ( ( object ) value1 ) ) ;
312
+ var source2 = CreateObservableExpression ( Observable . Return ( value2 ) ) ;
313
+ var resultProvider = TestCombinatorBuilder < Array , MultiArgumentDerivedCovariantMock > ( source1 , source2 ) ;
314
+ var result = Last ( resultProvider ) . Result ;
315
+ Assert . AreEqual ( value1 , result ) ;
316
+ }
273
317
}
274
318
}
0 commit comments