문제

다음과 같은 루틴이 주어지면 :

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 두 번째 지점이 사용되는 경우 변환이 사용됩니다.
  • 양방향으로 암시 적 변환이 있습니다 : 컴파일 타임 오류
  • 어느 쪽이든 전환이 없습니다 : 컴파일 타임 오류

그게 도움이 되나요?

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