2013-04-20 5 views
4

return 문에 대해 if-else를 3 진 연산자로 변경했을 때 이상한 동작이 나타났습니다.3 진 연산자에서 예기치 않은 동작이 발생했습니다.

class Foo 
{ 
    private bool condition; 
    private int intValue = 1; 
    private decimal decimalValue = 1M; 

    public object TernaryGet 
    { 
     get 
     { 
      return condition ? decimalValue : intValue; 
     } 
    } 

    public object IfElseGet 
    { 
     get 
     { 
      if (condition) 
       return decimalValue; 
      return intValue; 
     } 
    } 

    public Foo(bool condition) 
    { 
     this.condition = condition; 
    } 
} 

class Program 
    { 
     static void Main(string[] args) 
     { 
      var fooTrue = new Foo(true); 
      var fooFalse = new Foo(false); 

      Console.WriteLine("{0}, {1}", fooTrue.TernaryGet.GetType(), fooTrue.IfElseGet.GetType()); 
      Console.WriteLine("{0}, {1}", fooFalse.TernaryGet.GetType(), fooFalse.IfElseGet.GetType()); 
     }   
    } 

이의 출력은 다음과 같습니다 : 내가 여기에 코드를 단순화했습니다

System.Decimal, System.Decimal 
System.Decimal, System.Int32 

내가하지만 삼항에 대한 두 게터에 출력 INT32 두 번째 행을 기대 int에 대해 잘못된 CLR 유형이 다시 나타납니다.

코드와 그게 무엇을하려고하는지 신경 쓰지 마세요. 왜 이런 일이 일어나고 있는지 궁금 해서요. 누구든지 설명 할 수 있다면, 고맙겠습니다. result

var result = condition ? decimalValue : intValue; 

유형이 컴파일시에 정적으로 알려진해야합니다 옵션 중 하나/모두 일반적인 유형으로 주조되어 - 원 (조건부) 연산자의

답변

5

결과는 항상 단일 유형의이다. int에서 decimal까지는 decimal 유형보다 전체가 ? : 연산자 유형으로 선택됩니다.

그래서 당신은 전체 기능 (자동 캐스트를 보여주는)과 같이 쓸 수있다 :

public object TurnaryGet 
{ 
    get 
    { 
     /*decimal*/ var result = condition ? decimalValue : (decimal)intValue; 
     return (object)result; 
    } 
} 
+0

좋은 답변 감사합니다. ReSharper는 3 진으로 바꿀 것을 제안 했으므로 나는 그다지 생각하지 않았습니다. 그래도 가장자리의 경우가 조금 있습니다. 올바른 CLR 형식을 원했던 이유는 MVC 뷰에서 각 형식에 대해 편집기 템플릿과 함께 사용하기 위해서였습니다 –

2
condition ? decimalValue : intValue; 

이 일 경우

condition ? decimalValue : (decimal) intValue; 

시도 의미 : (나는 C 번호에 낯선 합니다만, 자바 에서이 작품)

condition ? (object) decimalValue : (object) intValue; 
관련 문제