“OverloadResolutionBasic” (Solution)

Answer

1
params object[]
2
params object[]
3
params T[]
4
params T[]
5
object, object
Copied!

Explanation

There are methods:
  • void Foo(object a) -> object
  • void Foo(object a, object b) -> object, object
  • void Foo(params object[] args) -> params object[]
  • void Foo<T>(params T[] args) -> params T[]
Let's consider each call separately.
  • Foo() -> params object[]
The object and object, object options is inaccessible because of number of arguments. The params T[] option is inaccessible because of the compiler can't resolve T. Thus, the right options is params object[].
  • Foo(null) -> params object[]
The object, object option is inaccessible because of number of arguments. The params T[] options is inaccessible because of the compiler can't resolve T. The params object[] option is acceptable in its expanded and unexpanded forms. In this case, we should choose the expanded form, i.e. the method signature will look like Foo(object[] args). Now, we have the object and object[] options. The compiler will choose more specific option, i.e. object[] (or params object[]).
  • Foo(new Bar()) -> params T[]
The object, object option is inaccessible because of number of arguments. The object and params object[] options request an additional implicitly conversion: Bar to object. So, the params T[] (or params Bar[]) option is more preferable.
  • Foo(new Bar(), new Bar()) -> params T[]
The object option is inaccessible because of number of arguments. The object, object and params object[] options request an additional implicitly conversion: Bar to object. So, the params T[] (or params Bar[]) option is more preferable.
  • Foo(new Bar(), new object()) -> object, object
The object option is inaccessible because of number of arguments. There is exactly one option without the params keyword: object, object. It is more preferable.

Links

Problem
Copy link