未分配的本地变量错误

时间:2016-06-09 00:24:35

标签: c#

所以我有一个只有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'

我怎样才能超越它。

感谢。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

考虑代码可能采用的路径。可能无法初始化_eValA,或者_eValB可能未初始化,因此您会收到错误。由于编译器可以检测到这一点,它会给你一个编译错误。你需要确保它们被设置为等于一个值(或者为null,这让编译器知道你对它们负责,正如here所解释的那样,但是注意null不适合于这种情况是因为在使用它们之前,您在ArgumentNullException电话中获得了.Union 0或1个文件。尝试:

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;
    }
}

这将确保它们在被使用之前都被初始化。