2012-05-28 4 views
2

다음 코드를 실행할 수없는 이유는 무엇입니까? 조건을 확인하고 값을 반환 할 필요없이 따라하는 방법을 실행하는 운영자 : "?"삼진 "? : operator"에 C#의 버그가 있습니까?

static int num = 0; 
    static void Main(string[] args) 
    { 
     (num == 0) ? inc() : dec(); 
    } 
    public static void inc() 
    { 
     num++; 
    } 
    public static void dec() 
    { 
     num--; 
    } 

이유는 C#을 나를 원을 사용하는 것을 허용하지 않습니다? 동등하게 여기에 :

  if (num == 0) inc(); 
      else dec(); 

나는 같은 규칙이 다른 언어에 적용되는 경우 확실하지 않다 예를 들어, 자바, C++, 등등 ... 삼항 연산자는 부울 표현식을 기준으로 값을 할당

답변

5

존 소총의 대답은 완벽하게 그 C#을 의도적 C가 아닌 다른 경로를 ++ 갔다 문서화된다.은 왜이라고 말하기는 어려우나, 그 질문에 답이 필요하다고 생각하기 때문에 노력할 것입니다.

C#은 C++ 및 Java와 많은 구문을 공유합니다. 이 경우 Java 방식이 선택되었습니다. 이는 2 + 2;을 독립 실행 형 문으로 작성할 수 없으며 3 진 연산자가 값을 반환하도록 요구하는 것입니다.

이러한 결정은 모두 액세스 할 수없는 코드 제거와 관련이 있다고 생각합니다. 2 + 2에있는 + 연산자는 최적화 될 수 있으므로 코드의 목적에 부합한다면 그 목적은 신뢰할 수 없게 제공됩니다! 정적 분석 (컴파일 오류 또는 경고)은 이러한 경우에 의미 론적 문제가있는 것으로 보이며 액세스 할 수없는 코드를 삭제하거나 다시 작성하도록합니다.

그래서 표현식은 더 이상 항상 명령문이 아니며 Java/C#의 경우 C 문법을 다시 정의해야하며 표현식은 항상 값을 반환하고 값은 반환하지 않습니다.

이제 ?:if - else은 주로 하나의 표현이 다르며 적어도 하나의 진술은 일반적인 용도에 따라 다릅니다. 따라서 재정의 된 문법은 void ternaries를 금지하고 그 목적으로 if - else을 추천하기 만했습니다.

2

때문입니다. 기본적인 C# 스펙. 만약 당신의 메소드가 void 타입이라면, - else 또는 switch case를 사용하는 것이 가장 좋습니다.

int a = true ? 0 : 1; //Always works 

true ? 0 : 1; //This will never work. 

예를 약간 수정했습니다.

static int num = 0; 

static void Main(string[] args) 
{ 
    num = (num == 0) ? inc(num) : dec(num); 
} 

public static int inc(int lnum) 
{ 
    return lnum + 1; 
} 

public static int dec(int lnum) 
{ 
    return lnum - 1; 
} 
26

왜 나는 다음과 같은 코드를 실행할 수 없습니다?

언어 사양을 위반하려고하기 때문에. 조건부 연산자의 피연산자 (C# 4 사양의 7.14 절)는 표현식이어야하며 반환 유형이 void 인 메서드 호출은 명시 적으로 "명령문 표현식의 컨텍스트에서만 유효합니다"(C# 4 사양의 섹션 7.1).

조건부 연산자의 목적은 조건에 따라 두 표현식 중 하나를 평가 한 결과 인 표현식을 제공하는 것입니다. 이 아니며 작업 중 하나를 실행하려면 조건에 따라을 기반으로합니다. if 문을 사용하십시오.

마찬가지로 조건 연산자는, 그 자체로 유효한 문을 형성하지 않는 이상 다양한 연산자를 수행

사양의 섹션 8.6에서 명시 적으로
a + b; // Invalid 
x = a + b; // Valid, assignment expression can be an expression-statement 

:

모든 표현을 진술로 허용됩니다. 특히, 단순히 값 (폐기 됨)을 계산하는 x + yx == 1과 같은 표현식은 명령문으로 허용되지 않습니다.

+0

@imad : 지금 당장은 대답 할 시간이 없지만 C# 4 언어 사양을 읽고 거기에서 읽으라고 제안합니다. :) –

2

에 대한 바이트 그러나이 방법을 사용하는 경우가 작동합니다

static int num = 0; 
static void Main(string[] args) 
{ 
    num = (num == 0) ? inc(num) : dec(num); 
} 
public static int inc(int number) 
{ 
    return number + 1; 
} 
public static int dec(int number) 
{ 
    return number - 1; 
} 
+0

위 코드는 여전히 오류를 나타내며 아마도 잊어 버린 것일 수 있습니다. 변경 무효로 int – Emo

+0

예 나는 그것을 잊었다. 결정된. –

+0

예. 가능합니다. 왜? 첫 번째 방법은 void가 아니라 반환 값이며 두 번째로 삼항 연산자가 num에 다시 할당됩니다. –

관련 문제