이 문제의 원인은 무엇입니까?
나에게 컴파일러 버그처럼 보입니다. 적어도 그렇습니다. 있지만 decimal.TryParse(v, out a)
및 decimal.TryParse(v, out b)
표현이 동적으로 평가, 내가 예상 컴파일러는 여전히 이해가가 도달하는 시간으로 a <= b
, 모두 a
와 b
확실히 할당됩니다. 동적 타이핑에서 생각 해낼 수있는 이상한 점이 있더라도 a <= b
두 TryParse
호출을 모두 평가 한 후에 만 평가할 것으로 기대 합니다.
그러나 연산자와 변환을 통해 까다로워서 충분히 교활하다면 A && B && C
평가 A
하고 평가 C
하지 않는 표현식을 갖는 것이 완전히 가능하다는 것이 밝혀졌습니다 B
. Neal Gafter의 독창적 인 예 는 Roslyn 버그 보고서 를 참조하세요 .
이 작업을 수행하는 dynamic
것은 훨씬 더 어렵습니다. 피연산자가 동적 일 때 관련된 의미는 설명하기가 더 어렵습니다. 왜냐하면 오버로드 해결을 수행하려면 어떤 유형이 관련되어 있는지 알아보기 위해 피연산자를 평가해야하는데, 이는 직관적이지 않을 수 있습니다. 그러나 Neal은 컴파일러 오류가 필요함을 보여주는 예제를 다시 제시했습니다. 이것은 버그가 아니라 버그 수정 입니다. 그것을 증명 한 Neal에게 엄청난 찬사를 보냅니다.
컴파일러 설정을 통해 수정할 수 있습니까?
아니요,하지만 오류를 방지하는 대안이 있습니다.
첫째, 동적이되는 것을 막을 수 있습니다. 문자열 만 사용할 것이라는 것을 알고 있다면 범위 변수 에 (예 :) 유형을 사용 IEnumerable<string>
하거나 지정할 수 있습니다 . 그것이 제가 선호하는 옵션입니다.v
string
from string v in array
당신이 경우 정말 그것을 동적를 계속해야, 단지 줄 b
로 시작하는 값을 :
decimal a, b = 0m;
이것은 아무런 해를 끼치 지 않을 것입니다. 실제로 동적 평가가 미친 짓을하지 않는다는 것을 알고 있으므로 b
사용하기 전에 값을 할당 하여 초기 값을 무의미하게 만듭니다.
또한 괄호 추가도 작동하는 것 같습니다.
where decimal.TryParse(v, out a) && (decimal.TryParse("15", out b) && a <= b)
이는 다양한 오버로드 해결이 트리거되는 지점을 변경하고 컴파일러를 행복하게 만듭니다.
이 하나 여전히 남아있는 문제 일 -와 명확한 과제에 대한 사양의 규칙 &&
운영자 필요성은 때에만 적용한다는 것은 명확히하는 &&
연산자는 두과의 "일반"구현에 사용되는 bool
피연산자. 다음 ECMA 표준을 위해 이것이 수정되었는지 확인하려고 노력할 것입니다.
b
를 통해 할당 한 후에 만 사용합니다out
.