【问题标题】:Operator '&&' cannot be applied to operands of type 'bool' and 'object' [closed]运算符'&&'不能应用于'bool'和'object'类型的操作数[关闭]
【发布时间】:2018-01-25 12:37:08
【问题描述】:

我有一个 for 语句,它通过给定数量的事件或在本例中为参数。在 for 内部,我有一个 if 语句,它检查某个参数是否存在,如果该参数存在,则执行某些操作等等。

for (int i = 1; i < eventToHandle.Parameters.Count; i++)
{
    if (eventToHandle.Parameters.ContainsKey($"DirectoryOne{i}") && 
        eventToHandle.CustomParameters[$"DirectoryOne{i}"])
    {
        DirectoryInfo rootDir = new DirectoryInfo(eventToHandle.Parameters[$"DirectoryOne{i}"].ToString());
        FileInfo[] files = rootDir.GetFiles();
        DirectoryInfo[] subDirs = rootDir.GetDirectories();
    }

我收到错误消息,说我不能在 bool 和 object 上使用 '&&'。在这种情况下,什么是好的解决方案?也许在这种情况下,带有“&&”的 if 语句根本不适合使用?

【问题讨论】:

  • 什么是eventToHandle.CustomParameters[$"DirectoryOne{i}"]?你想检查你的if 条件是什么?
  • 您能给我们一些eventToHandle.CustomParameters[$"DirectoryOne{i}"] 的示例值吗?你可能想bool.Parse()他们
  • 我想你想检查eventToHandle.CustomParameters.ContainsKey($"DirectoryOne{i}")。你所拥有的不是bool,而是object
  • 可能检查对象是否为空,如果 (eventToHandle.Parameters.ContainsKey($"DirectoryOne{i}") && eventToHandle.CustomParameters[$"DirectoryOne{i}"] !=null)跨度>

标签: c# .net for-loop


【解决方案1】:

您的代码似乎希望确保该值对于ToString 的调用是安全的,因此您应该检查它是否为null

由于您是在检查对象是否存在后从字典中获取字符串,因此请使用TryGetValue 以避免在字典中进行多次搜索:

object dir;
if (eventToHandle.Parameters.TryGetValue($"DirectoryOne{i}", out dir) && dir != null) {
    DirectoryInfo rootDir = new DirectoryInfo(dir.ToString());
    FileInfo[] files = rootDir.GetFiles();
    DirectoryInfo[] subDirs = rootDir.GetDirectories();
}

【讨论】:

  • 如果值为string&amp;&amp; dir is string directory 也可能会有所帮助。
  • 这很有帮助,我设法通过一些修改找到了解决方案。非常感谢。
【解决方案2】:

首先,您不能只使用带有&amp;&amp; 运算符的对象,因为它使用bool 值进行操作。你必须检查它是否不为空(!= null)。

您还应该使用Directory.Exists() 来检查该目录是否存在。

using System.IO;

for (int i = 1; i < eventToHandle.Parameters.Count; i++)
{
    if (eventToHandle.Parameters.ContainsKey($"DirectoryOne{i}") &&
        eventToHandle.CustomParameters[$"DirectoryOne{i}"] != null && 
        Directory.Exists(eventToHandle.CustomParameters[$"DirectoryOne{i}"].ToString()))
    {
        DirectoryInfo rootDir = new DirectoryInfo(eventToHandle.Parameters[$"DirectoryOne{i}"].ToString());
        FileInfo[] files = rootDir.GetFiles();
        DirectoryInfo[] subDirs = rootDir.GetDirectories();
    }

【讨论】:

  • 不会编译...
  • 为什么不能编译?
  • 你知道,因为你已经更新了代码。不过,此代码可能会引发空引用异常。
  • 为了您的方便,我添加了空检查。
【解决方案3】:

如果我没看错的话,'if' 语句有 2 个部分。首先,检查键是否存在(&& 的左侧),然后检查键是否映射到空值(&& 的右侧)。 && 比较 2 个布尔值,但右侧不是布尔类型,而是对象类型。要检查该对象引用是否不为空,您必须将 eventToHandle.CustomParameters[$"DirectoryOne{i}"] 更改为 eventToHandle.CustomParameters[$"DirectoryOne{i}"] != null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2011-04-03
    • 2014-10-13
    相关资源
    最近更新 更多