“OverloadResolutionBasic” (Solution)

Answer

params object[]
params object[]
params T[]
params T[]
object, object

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.

Problem

Last updated