Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подробнее о методах и классах.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
144.16 Кб
Скачать

8.9.1 Необязательные аргументы и перегрузка методов

В некоторых случаях необязательные аргументы могут стать альтернативой пере­грузке методов. Для того чтобы стало понятнее, почему это возможно, обратимся еще раз к примеру метода OptArgMeth(). До появления в C# необязательных аргументов нам пришлось бы создать три разных варианта метода OptArgMeth(), чтобы добиться таких же функциональных возможностей, как и у рассмотренного выше варианта это­го метода. Все эти варианты пришлось бы объявить следующим образом.

static void OptArgMeth(int alpha)

static void OptArgMeth(int alpha, int beta)

static void OptArgMeth(int alpha, int beta, int gamma)

Эти перегружаемые варианты метода OptArgMeth() позволяют вызывать его с од­ним, двумя или тремя аргументами. (Если значения параметров beta и gamma не пере­даются, то они предоставляются в теле перегружаемых вариантов данного метода.) Без­условно, в такой реализации функциональных возможностей метода OptArgMeth() с помощью перегрузки нет ничего дурного. Но в данном случае целесообразнее все же воспользоваться необязательными аргументами, хотя такой подход не всегда оказыва­ется более совершенным, чем перегрузка метода.

8.9.2 Необязательные аргументы и неоднозначность

При использовании необязательных аргументов может возникнуть такое затрудне­ние, как неоднозначность. Нечто подобное может произойти при перегрузке метода с необязательными параметрами. В некоторых случаях компилятор может оказать­ся не в состоянии определить, какой именно вариант метода следует вызывать, когда необязательные аргументы не заданы. В качестве примера рассмотрим два следующих варианта метода OptArgMeth ().

static void OptArgMeth(int alpha, int beta=10, int gamma = 20)

{

Console.WriteLine("Это аргументы alpha, beta и gamma: " +

alpha + " " + beta + " " + gamma);

}

static void OptArgMeth(int alpha, double beta=10., double gamma =20.) {

Console.WriteLine("Это аргументы alpha, beta и gamma: " +

alpha + " " + beta + " " + gamma);

}

Обратите внимание на то, что единственное отличие в обоих вариантах рассматри­ваемого здесь метода состоит в типах параметров beta и gamma, которые оказываются необязательными. В первом варианте оба параметра относятся к типу int, а во вто­ром  к типу double. С учетом этих вариантов перегрузки метода OptArgMeth() следующий его вызов приводит к неоднозначности.

OptArgMeth(1); // Ошибка из-за неоднозначности!

Этот вызов приводит к неоднозначности потому, что компилятору неизвестно, ка­кой именно вариант данного метода использовать: тот, где параметры beta и gamma имеют тип int, или же тот, где они имеют тип double. Но самое главное, что конкрет­ный вызов метода OptArgMeth() может привести к неоднозначности, даже если она и не присуща его перегрузке.

В связи с тем что перегрузка методов, допускающих применение необязательных аргументов, может привести к неоднозначности, очень важно принимать во внимание последствия такой перегрузки. В некоторых случаях, возможно, придется отказаться от применения необязательных аргументов, чтобы исключить неоднозначность и тем самым предотвратить использование метода непреднамеренным образом.