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);

ここでコンパイラは、開発者が最初のパラメーターでメソッドを呼び出すつもりだったのか、それとも 2 番目のパラメーターでメソッドを呼び出すつもりなのかを推測できません。

于 2012-11-09T13:58:23.880 に答える