未分配的局部变量错误



所以我有一个只有 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(@"httpunion.txt", union.Cast<String>());
}

但是我收到此错误:Use of unassigned local variable '_eValB, _eValA'

我怎样才能过去。

谢谢。

第一次通过循环时,您将永远不会同时分配_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);

考虑一下你的代码可以采用的可能路径。_eValA可能未初始化,或者_eValB可能未初始化,因此会出现错误。由于编译器可以检测到这一点,因此它会给您一个编译错误。您需要确保它们设置为等于一个值(或 null,这让编译器知道您对它们负责,如此处所述,但请注意 null 在这种情况下不合适,因为对于 0 或 1 个文件,您会在使用它们之前在.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;
    }
}

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

最新更新