«OverloadResolutionBasic» (Решение)
Ответ
params object[]
params object[]
params T[]
params T[]
object, objectОбъяснение
Итак, у нас имеются методы:
void Foo(object a)->objectvoid Foo(object a, object b)->object, objectvoid 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
Was this helpful?