声明了两个变量,但一个在上下文中,而另一个在当前上下文中不存在

时间:2013-01-29 14:43:05

标签: c# scope

如果我能通过图像显示我的意思会更简单,但我还无法加载图像。

我有一个属于公共静态类的私有静态方法。在该方法的开头,我声明了一个字符串和一个int。这是代码:

    private static string getSerialNumber(string drive)
    {
        string sn = string.Empty;
        int snLen = 0;
        try
        {
            drive = drive.TrimEnd(':') + ":";
            string sqlLDTP = String.Format("associators of {{Win32_LogicalDisk.DeviceID='{0}'}} where AssocClass= Win32_LogicalDiskToPartition", drive);
            ManagementObjectCollection mocLDTP = new ManagementObjectSearcher(sqlLDTP).Get();
            foreach (ManagementObject moLDTP in mocLDTP)
            {
                string sqlDDTDP = String.Format("associators of {{Win32_DiskPartition.DeviceID='{0}'}} " + "where AssocClass= Win32_DiskDriveToDiskPartition", moLDTP["DeviceID"]);
                ManagementObjectCollection mocDDTDP = new ManagementObjectSearcher(sqlDDTDP).Get();
                foreach (ManagementObject moDDTDP in mocDDTDP)
                {
                    string sqlDD = String.Format("Select MediaType, PNPDeviceID, SerialNumber From Win32_DiskDrive Where DeviceID='{0}'", moDDTDP["DeviceID"]).Replace("\\", "\\\\");
                    ManagementObjectCollection mocDD = new ManagementObjectSearcher(sqlDD).Get();
                    foreach (ManagementObject moDD in mocDD)
                    {
                        sn = moDD["SerialNumber"].ToString();
                        snLen = sn.Length;

                        ((Action)(() => { }))();  // Do nothing - NoOp

                        //System.Windows.MessageBox.Show("\"" + sn + "\", snLen: " + snLen);
                        // if (snLen == 0)
                        if (sn.Length == 0)
                        {
                            string mt = moDD["MediaType"].ToString();
                        }
                    }
                }
            }
        }
        catch { }
        return sn;
    }

我在((Action)...有一个断点,当我运行调试器并在该断点处停止并将鼠标放在snLen上时,它无法识别。但是,如果我发表评论if (sn.Length) == 0)并取消评论if (snLen == 0)并运行调试程序,并且当它在断点处停止并且我将鼠标放在snLen上时,现在可以识别该变量。然后我在调试器中固定该变量,然后注释并取消注释回原始状态。当我再次运行调试器并在断点处停止并将鼠标放在固定的snLen上时,我得到一个工具提示,上面写着“此表达式的值可能不正确。无法评估它,因为: '当前上下文中不存在名称'snLen''点击此按钮立即尝试重新评估。单击所述按钮会产生相同的结果。 sn变量始终可用,并且在调试期间鼠标可以看到其内容。 snsnLen都在同一范围内一个接一个地声明。为什么一个总是可用而另一个不可用?

另一个问题是,如果我将评论和取消评论反转,以便snLen在调试器中可用,当sn包含值时,snLen包含正确的值,长度sn。但是,当sn为空时,snLen包含1且它应包含0.导致这些事情发生的原因是什么?我知道foreach语句创建了一个内部作用域,但这并不妨碍对父作用域中声明的变量的访问,至少直到现在还没有。我不知道ManagementObjectSearcherManagementObjectCollectionManagementObject可能会与范围混淆。

非常感谢对此事的任何见解。

顺便说一句,如果存在正确的序列号,此方法会返回正确的序列号。下面的代码((Action)...最终将测试是否检索到序列号,如果没有,则测试驱动器是否为可移动驱动器,如果是,则获取PNPDeviceID字符串末尾的序列号。但是,此时,当没有序列号时,长度为1,它应为0,所以有些问题需要修复。

0 个答案:

没有答案