«OverloadResolutionBasic» (Решение)

Ответ

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

Объяснение

Итак, у нас имеются методы:
  • 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[]
Рассмотрим каждый вызов отдельно.
  • Foo() -> params object[]
Варианты object и object, object не подходят по количеству аргументов. Вариант params T[] не подходит, т.к. невозможно определить тип T. Таким образом, правильный вариант — params object[].
  • Foo(null) -> params object[]
Вариант object, object не подходит по количеству аргументов. Вариант params T[] не подходит, т.к. невозможно определить тип T. Вариант params object[] подходит в expanded и unexpanded формах, в этом случае мы выбираем expanded-форму, т.е. сигнатура будет выглядеть как Foo(object[] args). Из двух оставшихся вариантов object и object[] компилятор выберет более специфичный, т.е. object[] (он же params object[]).
  • Foo(new Bar()) -> params T[]
Вариант object, object не походит по количеству элементов. Варианты object и params object[] будут требовать дополнительной конвертации Bar в object, поэтому вариант params T[] (который, по сути, становится params Bar[]) более предпочтителен.
  • Foo(new Bar(), new Bar()) -> params T[]
Вариант object не подходит по количеству элементов. Варианты object, object и params object[] будут требовать дополнительной конвертации Bar в object, поэтому вариант params T[] (который, по сути, становится params Bar[]) более предпочтителен.
  • Foo(new Bar(), new object()) -> object, object
    Вариант object не подходит по количеству элементов. Среди оставшихся вариантов существует ровно одна версия без params: object, object. Она будет более предпочтительна.

Ссылки