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