4

我有一个带有 2 个可选参数的方法。

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
4

3 回答 3

9

如果要跳过其他可选参数,则必须指定可选参数的名称。

_order.GetComputers(ramSizeInGB: ram);
于 2012-11-09T13:58:12.530 回答
5

要允许编译器填充较早的参数,您需要指定后面的参数的名称:

_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
于 2012-11-09T13:58:23.780 回答
2

正确的语法是将命名参数与可选参数结合使用,如下所示:

_order.GetComputers(ramSizeInGB: ram);

仅当可选参数位于指定参数之后时,才可以跳过可选参数(不使用命名参数),因此可以:

_order.GetComputers(new Brand());

就像这

_order.GetComputers();

要了解为什么必须以这种方式完成,请考虑具有如下签名的方法:

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

Method(3);

在这里,编译器无法推断开发人员是否打算使用第一个参数或第二个参数调用该方法,因此区分的唯一方法是明确说明哪些参数映射到哪些参数。

于 2012-11-09T13:58:23.880 回答