C#에서 Out 및 명명된 매개변수 혼합:Out 매개변수에도 이름을 지정해야 하는 이유는 무엇입니까?
-
13-12-2019 - |
문제
짧은 버전:다음에 오는 명명된 인수 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
논쟁도 그렇고.