«OverloadResolutionBasic» (Решение)
Ответ
Объяснение
Итак, у нас имеются методы:
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
. Она будет более предпочтительна.
Ссылки
Глава «Overloading» в книге «C# in Depth»
Last updated