C#에서 Out 및 명명된 매개변수 혼합:Out 매개변수에도 이름을 지정해야 하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/9687969

문제

짧은 버전:다음에 오는 명명된 인수 out 인수는 컴파일러 오류를 제공하지만 언어 사양에서 이 동작에 대한 지원을 찾을 수 없습니다.

긴 버전:

나는 Enum.TryParse<TEnum> 세 개의 매개변수 오버로드가 있지만 저는 매개변수의 이름을 지정하고 싶습니다. ignoreCase 코드를 더 명확하게 만드는 매개변수는 다음과 같습니다.

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

부울의 의미를 불명확하게 남깁니다(이 방법이 알려지지 않은 한).1).따라서 다음을 사용하고 싶습니다.

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

그러나 컴파일러는 이를 오류로 보고합니다.

명명된 인수 'ignoreCase'는 위치 인수가 이미 제공된 매개변수를 지정합니다.

IDE는 다음을 강조합니다. ignoreCase 매개변수..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.

사양을 잘못 읽었습니까?아니면 컴파일러 버그인가요?

C# 7.2 업데이트

모든 명명된 인수에 대한 이러한 제한은 C# 7.2에서 호출이 해제된 경우 위치 인수를 따라야 합니다.

보다 https://docs.microsoft.com/en-gb/dotnet/csharp/whats-new/csharp-7-2#non-trailing-named-arguments.


1 따라서 프레임워크 디자인 지침의 조언은 다음과 같습니다. enum 매개변수.

2 예:주어진:

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

이 호출은 또한 명명된 매개변수에 대해 동일한 오류를 제공합니다. out 매개변수 이름도 다음과 같습니다.

TestMethod(1, out aString, two: 1.0f);
도움이 되었습니까?

해결책

명명된 매개변수를 사용하면 위치 인수를 "건너뛰기"할 수 없습니다.

코드는 처음 두 인수를 전달하여 구문 분석됩니다.value 그리고 ignoreCase, 그런 다음 통과 ignoreCase 다시.
와는 아무 관련이 없습니다. out매개변수의 본질.

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

다른 팁

모든 위치 인수는 일치해야 합니다. 인수 이름을 지정하여 순서를 다시 정렬하기 시작하면 이름을 지정한 인수 뒤에 오는 모든 인수를 다시 정렬해야 합니다.

따라서 다음 코드 줄은 다음과 같습니다.

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

일치를 시도합니다. out res ~와 함께 ignoreCase, 그런 다음 해당 매개변수의 이름을 다시 지정하면 컴파일러가 작동하지 않게 됩니다.아마도 첫 번째 오류 뒤에 또 다른 오류가 숨어 있을 것입니다. out res 일치하지 않습니다 ignoreCase.

따라서 위치 인수를 처리할 때ignoreCase를 "건너뛰"려면 out res 논쟁도 그렇고.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top