2016-06-09 5 views
0

폴더가 2 개 뿐이므로이를 읽고 값을 저장하고 있습니다. 이 코드는 모습입니다 :할당되지 않은 로컬 변수 오류

public static void UnionFiles() 
{ 
    var dinfo = 
     new DirectoryInfo(
      @"\http"); 
    var files = dinfo.GetFiles("*.txt"); 
    int i = 1; 
    System.Collections.Generic.IEnumerable<String> _eValA, _eValB; 

    foreach (var file in files) 
    { 
     if (i == 1) 
     { 
      _eValA = File.ReadLines(file.Name); 
      ++i; 
     } 
     else 
     { 
      _eValB = File.ReadLines(file.Name); 
      i = 1; 

     } 
    } 
    IEnumerable<String> union = _eValA.Union(_eValB); 
    File.WriteAllLines(@"\http\union.txt", union.Cast<String>()); 
} 

그러나 나는이 오류를 얻을 : 나는 그것을 과거를 얻을 수있는 방법 Use of unassigned local variable '_eValB, _eValA'

합니다.

감사합니다.

+0

필요한 경우 선언에서 'null'로 초기화하십시오. – sstan

+0

@sstan 나는 그것이 중복일지도 모른다는 것을 알고 있지만 비슷한 전제를 가진 적어도 100 개의 질문이 있습니다. 당신이 지적한 것은 정확한 전제가 아니라 비슷한 것입니다. –

+1

* 반드시 * 일 필요는 없습니다. 비슷한 정보는 적절한 정보를 알려주면 완벽합니다. 우리는 모든 사람의 구체적인 문제를 해결하기 위해 여기에있는 것이 아니라 지식 *을 공유하기 위해 여기에 있습니다. 지식을 사용하고 상황에 적용하는 것은 귀하의 책임입니다. 우리는 두 개의 정수 변수 A & B를 어떻게 추가할까요? *, 두 개의 정수 변수 B & C를 어떻게 추가합니까? 나는 A & B에 관한 것을 보았지만 나의 변수는 다른 이름을 붙였습니다. * –

답변

2

루프를 처음 사용하면 _evalA_evalB이 할당되지 않습니다. 이 문제를 피하려면 둘 다 할당해야합니다.

기타 관련 문제가 있습니다. 예를 들어 정확히 두 개의 파일이 없으면 어떻게됩니까?

정확히 두 파일이 있으므로 루프를 사용할 필요가 없습니다. 루프를 피하면 현재 문제를 쉽게 피할 수 있습니다. 예 :

var files = dinfo.GetFiles("*.txt"); 
System.Collections.Generic.IEnumerable<String> _eValA, _eValB; 

// Should really assert that files.Count == 2 
_evalA = File.ReadLines(files.First().Name); 
_eValB = File.ReadLines(files.Last().Name); 

IEnumerable<String> union = _eValA.Union(_eValB); 
+0

감사합니다. 아마도 가장 현명한 방법 일 것입니다. –

0

코드가 취할 수있는 가능한 경로를 생각해보십시오. _eValA이 초기화되지 않았거나 _eValB이 초기화되지 않아 오류가 발생할 수 있습니다. 컴파일러가이를 감지 할 수 있기 때문에 컴파일 오류가 발생합니다. 컴파일러가 here과 같이 설명 된 것처럼 컴파일러에서 해당 값을 책임지고 있음을 알 수있는 null 값과 같게 설정해야합니다. 그러나 0 또는 1 파일로 인해이 경우에는 null이 적절하지 않습니다. 그들을 이용하기 전에 .Union 전화에서 ArgumentNullException을 얻을 것입니다. 시도해보십시오 :

var _eValA = new string[0]; 
var _eValB = new string[0]; 

foreach (var file in files) 
{ 
    if (i == 1) 
    { 
     _eValA = File.ReadLines(file.Name); 
     ++i; 
    } 
    else 
    { 
     _eValB = File.ReadLines(file.Name); 
     i = 1; 
    } 
} 

이렇게하면 사용하기 전에 초기화됩니다.

+0

감사합니다. 일한다. –

+0

왜 배열 인스턴스를 만들겠습니까? –

+0

@EvanTrimboli 사용하기 전에 평가 변수를 초기화해야하기 때문에. 표시된 코드 블록 전체가 리팩토링되어 사실상 필요하지 않으므로 오류가 발생하는 이유와 컴파일러를 만족시키기 위해 수행 할 수있는 작업을 구체적으로 보여주는 것이 중요하다고 생각합니다. – mason

관련 문제