2012-11-09 3 views
4

두 개의 선택적 매개 변수가있는 메소드가 있습니다.선택적 인수 사용

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

내가 지금은 Brand 인수를 지정하지 않는 경우 다른 곳에서이 방법을 사용하려고 그냥 int하지만지고있어 오류가이 코드를 사용하고 있습니다 :

_order.GetComputers(ram); 

오류 I 수신 중 :

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 

답변

9

다른 선택적 인수를 건너 뛰려면 선택 인수의 이름을 지정해야합니다.

_order.GetComputers(ramSizeInGB: ram); 
+0

고마워요! 그게 효과가 있었어. – Neeta

+0

매일 새로운 것을 배웁니다! 감사! –

5

컴파일러에 의해 작성되는 이전 인수를 허용하려면, 당신은 나중에 사람의 이름을 지정해야합니다

_order.GetComputers(ramSizeInGB: ram); 

기본적으로 C# 컴파일러는 어떤 인수를 지정하지 않는 것으로 가정 이름으로 제공하는 인수는 추가 순서입니다. 모든 매개 변수에 값을 제공하지 않고 나머지 매개 변수에 기본값이 있으면 해당 기본값이 사용됩니다.

_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 
2

정확한 구문 선택적인 매개 변수와 관련하여 명명 된 인수를 사용하는 것, 이런 :

_order.GetComputers(ramSizeInGB: ram); 

그래서 이러한 모든 유효 (적절한 brand의 값 ram 가정)이다

선택적 매개 변수는 지정된 인수 뒤에 위치 할 때만 (명명 된 인수를 사용하지 않고) 건너 뛸 수 있으므로이 인수는 괜찮습니다.

_order.GetComputers(new Brand()); 

같은 것 이런 서명하는 방법을 고려하는 이유는이 방법으로 수행해야합니다 보려면이

_order.GetComputers(); 

: 여기

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

Method(3); 

컴파일러가 추론 할 수 없습니다 개발자가 첫 번째 매개 변수 또는 두 번째 매개 변수를 사용하여 메서드를 호출하려는 경우 고유 한 방법은 명시 적으로 어떤 매개 변수가 어떤 매개 변수에 매핑되는지 명시하는 것입니다.