2016-06-09 3 views
0

Итак, у меня есть папка с двумя текстовыми файлами, я читаю их и сохраняю значение. Это то, что код выглядит:Непризнанная ошибка локальной переменной

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

Он не обязательно должен быть точным *. Аналогичная ситуация совершенно прекрасна, если она указывает вам на соответствующую информацию. Мы здесь не для решения конкретной проблемы каждого, а для обмена * знаниями *. Вы обязаны использовать эти знания и применять их к своей ситуации. Нам не нужны 200 таких вопросов, как * Как добавить две целые переменные A & B? *, За которыми следует * Как добавить две целые переменные B & C? Я видел одно из них, но мои переменные называются по-разному. * –

ответ

2

Впервые в вашей петле у вас никогда не будет и , и _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 файлами вы получите ArgumentNullException по вызову .Union), прежде чем использовать их. Попытка:

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 Поскольку переменные eval необходимо инициализировать перед использованием. Это правда, что весь отображаемый блок кода может быть реорганизован, поэтому нет необходимости в нем, но я думаю, что важно четко показать, почему произошла ошибка, и что можно сделать для удовлетворения компилятора. – mason