2010-02-18 6 views
2

나는 다음 코드가 있습니다여러 번에 한 번에 할당되지 않은 지역 변수가 있습니까?

static void Main(string[] args) 
    { 
    byte currency; 
    decimal amount; 
    if (Byte.TryParse("string1", out currency) && Decimal.TryParse("string2", out amount)) 
    { 
     Check(currency, amount); 
    } 
    Check(currency, amount); // error's here 
    } 

    static void Check(byte b, decimal d) { } 

을하고 다음 오류가 발생합니다 :

Use of unassigned local variable 'amount'

왜 내가 전혀 무엇입니까이 왜에만 amount에 대한 법적인가? 이 경우 currency이 할당되고 amount이 아닌 이유는 무엇입니까?

+0

자세한 내용은이 질문을 참조하십시오. http://stackoverflow.com/questions/1542824/c-initialization-of-instance-fields-vs-local-variables – M4N

답변

2

봐 버그를보고 할 수 있습니다 short-circuit 평가입니다. 즉, 첫 번째 Byte.TryParse이 성공하지 못하면 두 번째 Decimal.TryParse은 절대로 실행되지 않습니다.

currencyTryParse이 구문 분석에 실패한 경우 out currency ref를 기본값으로 설정하기 때문에 항상 할당됩니다. 그러나 amount은이 경우 계속 정의되지 않습니다.그것은 마치 다음과 같은 코드를 작성한 것입니다 :

if (Byte.TryParse("string1", out currency)) 
{ 
    if (Decimal.TryParse("string2", out amount)) 
    { 
     Check(currency, amount); 
    } 
} 
Check(currency, amount); 

이것은 어떤 일이 벌어지고 있는지 더 분명하게 보여줍니다. 첫 번째 if 문 안의 부분은 항상 실행되고 currency에 값이 지정됩니다. 내부의 파트 중첩 된 if 문은 첫 번째 성공한 경우에만 실행됩니다. 그렇지 않으면 amount은 두 번째에 도달 할 때까지 아무런 가치가 없습니다. Check.

당신은 currency 구문 분석 할 수없는 경우, 그럼 그냥 기본값으로 지역 주민을 초기화 기본값을 사용하려면 :

byte currency = 0; 
decimal amount = 0; 
if (Byte.TryParse("string1", out currency) && 
    Decimal.TryParse("string2", out amount)) 
{ 
// Etc. 

아니면 단순히 @Martin로, 둘 다 분석 할 수 고 밝혔다.

0

컴파일러가 amount에 첫 번째 값인 TryParse()이 실패했다고 보장 할 수없는 경로가 있기 때문에 이런 현상이 발생합니다. 그래서 amount을 사용하려고하는 줄에서 오류가 발생합니다. 아웃 인수로 전달

From MSDN:

변수는 초기화 할 필요는 없다. 그러나 메서드가 반환되기 전에 out 매개 변수에 값을 할당해야합니다.

당신은 당신의 지역 변수에 기본 값을 할당하여 해결할 수 있습니다

: 당신이 두 TryParse() 호출이있는 경우, 예를 들어, (정말 좋은 코드가 아닌) 만들어진 것을 확인해야 그렇지

decimal amount = 0; 

:

bool b1 = Byte.TryParse("string1", out currency); 
bool b2 = Decimal.TryParse("string2", out amount); 

if (b1 && b2) {...} 

BTW :

int a, b=1; 
int c = a+b; 
0 a 값이 할당되어 있지 않기 때문에 또한, 같은 컴파일러 에러를 생성 할 것이다 코드 단편
+0

@Martin : Struts는 기본적으로 값을 가져 오며, 그렇지? – abatishchev

+0

@Martin : 실행시 오류가 발생하지 않는다고 생각합니다. IDE에서만 경고합니다. 두 TryParse 호출이 실패해야합니다. 왜 경고가 바이트 하나가 아닌 십진수에 대해서만 표시됩니까? –

+0

@Rick Mogstad : 경고 이벤트가 아니라 이벤트입니다. – abatishchev

1

할당되지 않은 변수를 사용하지 못하도록하는 컴파일러 경고입니다 (이해 하겠지만). 할당되지 않은 변수 중 하나를 사용할 때만 가져 오는 이유는 설명 할 수 없습니다.

1

C# 언어 사양의 5.3 장에서 이에 대해 설명합니다. 그것은 살찐 장이지만 컴파일러가 할당되지 않은 "통화"변수에 대한 오류를 발생시켜야한다는 것을 확실히 알게됩니다. if() 문을 주석 처리하고 차단하면 흥미 롭습니다. 이제 컴파일러가 갑자기 나타납니다. 비록 "통화"는 주석이 달린 코드에서 사용되지 않았습니다.

그건 옳지 않아, 당신이 버그를 발견했다고 생각합니다.

if (Byte.TryParse("string1", out currency) && 
    Decimal.TryParse("string2", out amount)) 

&& 연산자는 다음과 같습니다 에릭 Lippert의 곁에 통과하지 않는 경우 connect.microsoft.com에서 (내가 두 줄에 분리 한)이 라인에서

+2

이것은 버그가 아닙니다. 첫 번째'TryParse'는 항상 실행되고 out arg를 기본값으로 설정합니다. 두 번째'TryParse'는 첫 번째 시도가 실패 할 경우 실행되지 않을 것이므로'amount'의 값은 정의되지 않을 수 있습니다. 그러나'currency'의 값은되지 않습니다. – Aaronaught

+0

죄송합니다. 다른 인수를 사용하여 TryParse 호출을 보지 못했습니다. –

+1

내 관심을 불러 일으킬만한 것이 있다면 내 블로그의 연락처 링크를 언제든지 사용할 수 있습니다. –

관련 문제