Использование необязательных аргументов

У меня есть метод с двумя необязательными параметрами.

public IList<Computer> GetComputers(Brand? brand = null, int? ramSizeInGB = null)
{
    return new IList<Computer>();
}

Теперь я пытаюсь использовать этот метод в другом месте, где я не хочу указывать аргумент Brand, а только int, но я получаю ошибки, используя этот код:

_order.GetComputers(ram);

Ошибки, которые я получаю:

Error   1   The best overloaded method match for 'ComputerWarehouse.Order.GetComputers(ComputerWarehouse.Brand?, int?)' has some invalid arguments  C:\Users\avmin!\Documents\InnerWorkings Content\630dd6cf-c1a2-430a-ae2d-2bfd995881e7\content\T0062A2-CS\task\ComputerWarehouse\ComputerStore.cs 108 59  ComputerWarehouse
Error   2   Argument 1: cannot convert from 'int?' to 'ComputerWarehouse.Brand?'    C:\Users\avmin!\Documents\InnerWorkings Content\630dd6cf-c1a2-430a-ae2d-2bfd995881e7\content\T0062A2-CS\task\ComputerWarehouse\ComputerStore.cs 108 79  ComputerWarehouse

person Neeta    schedule 09.11.2012    source источник


Ответы (3)


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

_order.GetComputers(ramSizeInGB: ram);
person Seth Flowers    schedule 09.11.2012

Чтобы разрешить компилятору заполнение более ранних аргументов, необходимо указать имена более поздних:

_order.GetComputers(ramSizeInGB: ram);

По сути, компилятор C# предполагает, что если вы не укажете имена аргументов, аргументы будут указываться в дополнительном порядке. Если вы не укажете значения для всех параметров, а остальные параметры имеют значения по умолчанию, будут использоваться эти значения по умолчанию.

Итак, все они действительны (при соответствующих значениях brand и ram):

_order.GetComputers(brand, ram);       // No defaulting
_order.GetComputers(brand);            // ramSizeInGB is defaulted
_order.GetComputers(brand: brand);     // ramSizeInGB is defaulted
_order.GetComputers(ramSizeInGB: ram); // brand is defaulted
_order.GetComputers();                 // Both arguments are defaulted
person Jon Skeet    schedule 09.11.2012

Правильный синтаксис — использовать именованные аргументы в сочетании с необязательными параметрами, например:

_order.GetComputers(ramSizeInGB: ram);

Необязательные параметры можно пропустить (без использования именованных аргументов) только в том случае, если они расположены после указанных аргументов, так что это будет нормально:

_order.GetComputers(new Brand());

как бы это

_order.GetComputers();

Чтобы понять, почему это нужно делать именно так, рассмотрим метод с такой сигнатурой:

public void Method(double firstParam = 0, long secondParam = 1)

Method(3);

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

person SWeko    schedule 09.11.2012