나는이 코드를 작성했다 :
private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion)
{
switch (criterion.ChangeAction)
{
case BindingType.Inherited:
var action = (byte)ChangeAction.Inherit;
return (x => x.Action == action);
case BindingType.ExplicitValue:
var action = (byte)ChangeAction.SetValue;
return (x => x.Action == action);
default:
// TODO: Localize errors
throw new InvalidOperationException("Invalid criterion.");
}
}
그리고 컴파일 오류를 발견 한 것에 놀랐습니다.
'action'이라는 지역 변수가 이미이 범위에 정의되어 있습니다.
해결하기 매우 쉬운 문제였습니다. 두 번째를 제거하는 var
것이 트릭을 수행했습니다.
분명히 case
블록에 선언 된 변수는 parent의 범위를 switch
갖지만 이것이 왜 그런지 궁금합니다. C #은 실행이 (가 다른 경우를 통해 떨어지지 않는 것을 감안할 필요 break
, return
, throw
, 또는 goto case
모든의 끝에 문 case
블록), 그것은 하나의 내부는 변수 선언을 허용 것이 매우 이상한 것 같다 case
다른 변수와 함께 사용하거나 충돌 할 case
. 다시 말해 case
, 실행이 불가능하더라도 변수는 명령문을 통과하는 것으로 보입니다 . C #은 혼란 스럽거나 쉽게 남용되는 다른 언어의 일부 구문을 금지하여 가독성을 높이기 위해 많은 노력을 기울입니다. 그러나 이것은 혼란을 야기 할 수밖에없는 것처럼 보입니다. 다음 시나리오를 고려하십시오.
이것을 다음과 같이 바꾸려면 :
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: return (x => x.Action == action);
" 할당되지 않은 로컬 변수 'action' "이 사용되었습니다. 내가 생각할 수있는 C #의 다른 모든 구문에서
var action = ...
변수를 초기화 하기 때문에 혼란 스럽지만 여기서는 단순히 변수를 선언합니다.내가 이런 경우를 바꾸려면 :
case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; return (x => x.Action == action); case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action);
" 로컬 변수 'action'을 (를) 선언하기 전에 사용할 수 없습니다 "가 표시됩니다. 일반적으로 내가 어떤 주문 I 소원 이러한 쓸 수 있지만,이 때문에 - 케이스 블록의 순서는 완전히 명확하지의 방법으로 여기에 중요한 것으로 나타납니다 그래서
var
첫 번째 블록에 표시되어야합니다action
사용되는, 내가 조정할 필요가case
블록을 따라서.이것을 다음과 같이 바꾸려면 :
case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: action = (byte)ChangeAction.SetValue; goto case BindingType.Inherited;
그런 다음 오류가 발생하지 않지만 어떤 의미에서는 변수가 선언되기 전에 값이 할당 된 것처럼 보입니다 .
(실제로 이것을하고 싶을 때를 생각할 수는 없지만goto case
오늘 전에는 존재 조차 알지 못했습니다 )
그래서 제 질문은 C #의 디자이너가 왜 case
자신의 로컬 범위를 블록에 제공하지 않았 습니까? 이에 대한 역사적 또는 기술적 이유가 있습니까?
switch
있습니다.이 디자인의 이유에 대해 궁금합니다.
break
.
action
앞에 변수를 선언switch
하거나 각 케이스를 중괄호에 넣으면 합리적인 동작이 발생합니다.