2011-03-18 1 views
11

선택적 메서드 매개 변수에 런타임 값을 사용하는 방법이 있습니까?C# 4.0의 선택적 매개 변수에 컴파일 타임 상수가 필요한 이유는 무엇입니까?

+0

가능한 복제본 [C#의 선택적 매개 변수에 대한 기본값으로 String.Empty를 사용할 수 없다 - 그 다음 요점은 무엇입니까?] (http://stackoverflow.com/questions/2701314/cannot-use-string-empty- 선택적 매개 변수를 C 샤프로 사용하는 디폴트 값으로) – nawfal

답변

11

선택적 매개 변수는 특성 값으로 쓰여 지므로 상수 여야합니다. 따라서 속성 값에있는 모든 제한 사항을 상속합니다.

런타임 값을 직접 인코딩 할 수있는 방법은 없습니다. 그러나 당신은 가까운

public void MyApi(SomeType type = null) { 
    type = type ?? new SomeType(); 
    ... 
} 
+1

고마워, 그건 깔끔한 트릭 같아. 호기심에서, 속성을 사용하여 구현 된 이유를 알고 있습니까? 이미 프레임 워크에있는 것을 재사용한다고 가정합니까? –

+1

@Joan IIRC 그것은 다른 언어 (VB.Net)가하는 방식이기 때문에 속성을 사용하여 수행되므로 그에 대한 호환성을 제공합니다. – JaredPar

+1

@ Joan : 특성을 사용하여이 기능이없는 언어를 손상시키지 않습니다. .NET의 모든 내용은 언어 중립적이어야하는 양식으로 컴파일됩니다 ... 속성은 다른 .NET 언어의 변경 사항을 적용하지 않고도 특정 언어로 선택적 매개 변수를 처리 할 수있는 확실한 방법입니다. –

5

선택적 매개 변수는 어셈블리에 컴파일되므로 (마찬가지로 const으로 지정된 것과 유사 함) 컴파일 타임 상수 여야합니다.

그리고 아니요, 실행 시간 값을 선택적 매개 변수로 사용할 수 없습니다.

+1

감사하지만 런타임 참조에 대한 참조로 컴파일 할 수 없습니까? 이렇게 말하십시오 :이. 파일 이름, 등등 동일한 종류 내의? –

5

선택적 매개 변수가 컴파일 시간에서 결정, 당신은 너무 적은 매개 변수와 메소드를 호출하면 방법에 대입 다음과 같은 패턴을 얻을 수 있습니다. 메서드의 IL에있는 매개 변수에 특성을 추가하여 처리합니다.

이와 같이 컴파일 타임에 완벽하게 해결되어야합니다 (둘 다 생성되기 때문에 애트리뷰트이기 때문에 또한 사용될 때도 마찬가지입니다). 선택적 메소드 매개 변수에 런타임 값을 사용하는 방법은 없습니다.