> For the complete documentation index, see [llms.txt](https://andreyakinshin.gitbook.io/problembookdotnet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://andreyakinshin.gitbook.io/problembookdotnet/ru/oop/overloadresolutionbasic-s.md).

# «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`. Она будет более предпочтительна.

## Ссылки

* [«Overload resolution»](http://msdn.microsoft.com/library/aa691336.aspx), [«Applicable function member»](http://msdn.microsoft.com/en-US/library/aa691337.aspx) в MSDN
* Глава [«Overloading»](http://csharpindepth.com/Articles/General/Overloading.aspx) в книге [«C# in Depth»](http://csharpindepth.com/)

[Задача](/problembookdotnet/ru/oop/overloadresolutionbasic-p.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://andreyakinshin.gitbook.io/problembookdotnet/ru/oop/overloadresolutionbasic-s.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
