Resharper Trap“ 'Return'진술로 변환”
-
06-07-2019 - |
문제
다음과 같은 루틴이 주어지면 :
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
Resharper는 Ternary Operator와 함께 성명서에 리팩터링 할 수있는 옵션을 제공합니다.
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
누가 함정을 발견 할 수 있습니까?
해결책
좋아, 이전 답변으로 변경하십시오. 암시 적 변환이 있기 때문입니다 Int64
에게 Double
(그러나 그 반대는 아닙니다)는 표현식의 결과 유형이 될 것입니다. 따라서 상자를 얻을 것으로 예상됩니다 Int64
, 당신은 실제로 상자를 얻습니다 Double
(그러나 원래는 값으로 Int64.Parse
).
충분히 명확하지 않은 경우, 모든 것을 바꾸겠습니다. return
변수를 반환하는 진술. 원래 코드는 다음과 같습니다.
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
return Double.Parse(token);
else
return Int64.Parse(token);
}
적절하게 변환하십시오.
private static object ParseNumber(string token, FieldDefinition def)
{
if (def.Fraction > 0)
{
double d = Double.Parse(token);
object boxed = d; // Result is a boxed Double
return boxed;
}
else
{
long l = Int64.Parse(token);
object boxed = l; // Result is a boxed Int64
return boxed;
}
}
이제 조건부 연산자와 버전과 동일하게합시다.
private static object ParseNumber(string token, FieldDefinition def)
{
return def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
}
becomes
private static object ParseNumber(string token, FieldDefinition def)
{
// The Int64.Parse branch will implicitly convert to Double
double d = def.Fraction > 0 ? Double.Parse(token) : Int64.Parse(token);
object boxed = d; // *Always* a Double
return boxed;
}
편집 : 요청에 따라 조금 더 많은 정보가 있습니다. 형태의 조건부 표현식의 유형
X ? Y : Z
유형에 따라 다릅니다 Y
그리고 Z
, 내가 전화 할거야 TY
그리고 TZ
. 몇 가지 옵션이 있습니다.
TY
그리고TZ
동일한 유형입니다. 결과는 해당 유형입니다- 암시 적 변환이 있습니다
TY
에게TZ
그러나 출신이 아닙니다TZ
에게TY
: 결과는 유형입니다TZ
첫 번째 지점을 사용하면 변환이 사용됩니다. - 암시 적 변환이 있습니다
TZ
에게TY
그러나 출신이 아닙니다TY
에게TZ
: 결과는 유형입니다TY
두 번째 지점이 사용되는 경우 변환이 사용됩니다. - 양방향으로 암시 적 변환이 있습니다 : 컴파일 타임 오류
- 어느 쪽이든 전환이 없습니다 : 컴파일 타임 오류
그게 도움이 되나요?
제휴하지 않습니다 StackOverflow