2012-03-13 2 views
5

짧은 버전 : out 인수 뒤에 명명 된 인수는 컴파일러 오류를 발생 시키지만 언어 사양에서이 동작에 대한 지원을 찾을 수 없습니다.C#의 매개 변수와 명명 된 매개 변수 혼합 : 왜 매개 변수의 이름을 지정해야합니까?

긴 버전 :

나는 Enum.TryParse<TEnum> 세 가지 매개 변수 오버로드를 사용하고 있습니다,하지만 난 내 코드를 명확하게 할 수있는 ignoreCase 매개 변수와 같은 호출 이름을 선호하는 것 :

MyEnum res; 
b = Enum.TryParse<MyEnum>(inputString, true, out res); 

잎 불리언 값의 의미는 명확하지 않다 (이 방법이 알려져 있지 않다면). 그러므로 내가 사용하고 싶습니다 :

Named argument 'ignoreCase' specifies a parameter for which a positional argument has already been given

와 IDE ignoreCase 매개 변수를 강조 :

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true); 

오류로 컴파일러 보고서이 그러나

. .NET 4를 대상으로하는 VS2010 및 4 또는 4.5를 대상으로하는 VS11 베타 모두 동일한 결과를 제공합니다. 모든 경우에 out 매개 변수의 이름을 지정하면 오류가 제거됩니다.

b = Enum.TryParse<MyEnum>(inputString, result: out res, ignoreCase: true); 

나는 프레임 워크에서 내 어셈블리에 모두 (피 제네릭 포함) 다른 방법의 숫자에 걸쳐이 시도 2했습니다 항상 같은 결과를 : 명명 된 매개 변수 뒤에 out 매개 변수를 제공합니다 오류. 나는이 오류의 이유를 볼 수 없습니다

및 § 7.5.1 인수를 나열 C# 언어 사양의 : 버전 4.0 명명 된 매개 변수 뒤에 out가 제공해야하는 이유 모든 이유를 제공하지 않는 것 오류. 오류의 텍스트는 버그로 해석 할 수 있습니다 : ignoreCase에 대해 유효한 일치 일 수있는 위치 인수가 없습니다.

사양을 잘못 읽었습니까? 또는이 컴파일러 버그가 무엇입니까?


1 따라서 프레임 워크 디자인 가이드 라인의 조언은 enum 매개 변수를 선호합니다.

2 예는 : 주어진 :

private static void TestMethod(int one, float two, out string three) { 
    three = "3333"; 
} 

이 호출은 또한 명명 된 매개 변수에 동일한 오류를 제공 이것을 out 매개 변수도 이름이되지 아니하는

이 에게
TestMethod(1, out aString, two: 1.0f); 

답변

6
에게

명명 된 매개 변수를 허용하지 않습니다 당신은 위치 인수를 건너 뛸 수 있습니다.

코드는 처음 두 개의 인수 — valueignoreCase을 전달한 다음 다시 ignoreCase을 전달하는 것으로 구문 분석됩니다.
매개 변수의 값은 out과 아무런 관련이 없습니다.

마지막 매개 변수도 명명 된대로 전달하여 문제를 해결할 수 있습니다.

+1

사양을 다시 읽으면이 접근법을 알 수 있습니다. 이름이 지정된 매개 변수를 명명 된 인수와 일치시킨 다음 나머지 위치 매개 변수와 나머지 위치 매개 변수를 일치시키는 방식으로 PowerShell 방식을 사용하지 않습니다. – Richard

3

모든 위치 지정 인수가 일치해야합니다. 인수의 이름을 지정하여 순서 재 배열을 시작하는 경우 이름을 지정한 다음의 모든 인수를 다시 정렬해야합니다.

그래서 코드 줄은 :

b = Enum.TryParse<MyEnum>(inputString, out res, ignoreCase: true); 

ignoreCaseout res 일치하도록 시도하고 당신은 컴파일러 위로 여행하는, 다시 매개 변수를 명명 따라 온다. 첫 번째 코드 뒤에 또 다른 오류가있을 가능성이 높습니다. out resignoreCase과 일치하지 않습니다.

따라서 위치 인수를 처리 할 때 ignoreCase를 건너 뛰려면 "out res"인수도 지정해야합니다.

관련 문제