【问题标题】:Visual Studio seems to be throwing an error even when changing the code即使更改代码,Visual Studio 似乎也会引发错误
【发布时间】:2020-08-04 08:08:32
【问题描述】:

这真的很奇怪,有点难以解释,所以请跟我来。

我有一些非常基本的 c# 代码,它基于输入的字符串运行,然后将该字符串放入记录器中,然后用它进行一些搜索等。细节有些不重要。

因此,它不断抛出“索引超出数组边界”。即使出于测试目的我在使用它之前手动设置字符串数组,也会出错。

args[0] = "{XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";
logger.Info("guid:" + args[0]); //Errors here
 _fetchxml = _myApp.getFetchXml("fileguid", args[0], new Guid(), new Guid());

我什至只是尝试在刚刚说 var a = "a" 的记录器之前添加一行,但它在该行上给出了相同的错误,这让我认为它与构建有关?

我已经清理并重建了解决方案,但没有运气,希望这是有道理的。

【问题讨论】:

  • 如果将Debug.WriteLine(args.Length); 放在这些代码行之前会发生什么?
  • 它会抛出同样的错误异常,但在 Debug.WriteLine
  • 没有调试输出?如果是这样,那么异常是完全从其他地方抛出的。
  • logger 是你写的自定义类的对象吗?如果是这样,请在 Info 方法中添加一个 try catch 并查看异常是否实际在 logger 中引发。
  • 抱歉,args[] 是如何声明和启动的?您是在谈论argsMain 功能吗?你试过用:if(args == null || args.Length == 0)吗?

标签: c# visual-studio dynamics-crm microsoft-dynamics


【解决方案1】:

数组是不可变的(即固定大小),因此如果数组的长度为零,如果您尝试添加字符串并将其分配到其第一个位置(不存在),它将引发异常。

按照 cmets 中的建议,您可以通过添加 if 块来简单地确认 args.Length 是否确实为 0:

if(args.Length > 0)
{
    args[0] = "{XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}";
    logger.Info("guid:" + args[0]); //No more Errors here?
    _fetchxml = _myApp.getFetchXml("fileguid", args[0], new Guid(), new Guid());
}
else 
{ 
    logger.Info("guid: --no arguments found--"); 
    // or if _fetchxml is crucial:
    throw new ArgumentException("No guid given");
}

或者,如果只是为了测试,你可以完全替换 args 数组:

args = new[] { "{XXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" };

或者更好的是,在“命令行参数”的“启动选项”下的项目属性的调试部分设置参数(当然假设这些确实是命令行参数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2021-07-20
    • 2019-09-25
    • 2021-10-01
    • 2019-08-09
    • 2019-03-01
    • 2016-01-04
    相关资源
    最近更新 更多